Rozdział 16 . Autoryzacja HTTP w PHP

Autoryzacja HTTP jest obsługiwana przez PHP tylko wtedy , gdy PHP pracuje jako moduł Apache ' a , nie jest dostępna w trybie CGI . W skrypcie można użyć funkcji header( ) W skrypcie można użyć funkcji header( ) by wysłać do przeglądarki komunikat "Wymagana autoryzacja " , co spowoduje wyświetlenie okienka z polami Użytkownik i Hasło . Po wypełnieniu przez użytkownika tych pól , URL zawierający skrypt PHP zostanie ponownie wywołany z ustawionymi predefiniowanymi zmiennymi PHP_AUTH_USER , PHP_AUTH_PW i PHP_AUTH_TYPE zawierającymi odpowiednio nazwę użytkownika , hasło i typ autoryzacji . Zmienne te będą dostępne w tablicach $_SERVER oraz $HTTP_SERVER_VARS . Obecnie obsługiwana jest jedynie autoryzacja typu " Basic " . Więcej informacji znajdziesz w opisie funkcji header( ) .

Przykładowy skrypt wymuszający autoryzację klienta :

Przykład 16-1 . Autoryzacja HTTP





 
Basic

 
realm="

 
My

 
Realm"')

 
;

 
header('HTTP

 
/

 
1.0 401

 
Unauthorized')

 
;

 
echo

 
'Tekst

 
do

 
wysłania

 
,

 
jeśli

 
użytkownik

 
wciśnie

 
przycisk

 
Anuluj'

 
;

 
exit

 
;

 
}

 
else

 
{

 
echo

 
"

 
p

 
Hej

 
{$_SERVER['PHP_AUTH_USER']}

 
.

 
/

 
p

 
"

 
;

 
echo

 
"

 
p

 
Twoje

 
hasło

 
to

 
{$_SERVER['PHP_AUTH_PW']}

 
.

 
/

 
p

 
"

 
;

 
}

 
?





Kompatybilność : Należy uważać z linijkami dodawanymi do nagłówka HTTP . W celu zachowania maksymalnej zgodności ze wszystkimi klientami , słowo Basic powinno zaczynać się dużą literą " B" , wartość realm powinna być otoczona cudzysłowami (nie apostrofami ) , i dokładnie jeden znak odstępu powinien poprzedzać kod 401 w linii HTTP / 1.0 401 .

Zamiast wyświetlać wartość PHP_AUTH_USER i PHP_AUTH_PW , jak to zrobiono w powyższym przykładzie , zechcesz zapewne sprawdzić poprawność nazwy użytkownika i hasła . Na przykład poprzez zapytanie do bazy danych lub odnalezienie użytkownika w pliku dbm .

Należy uważać na kapryśne przeglądarki Internet Explorer . wrażliwe na kolejność wysyłanych nagłówków HTTP . Wysłanie nagłowka WWW-Authenticate przed HTTP / 1.0 401 powinno rozwiązać problem .

Aby zapobiec sytuacji w której ktoś napisze skrypt wykradający hasło wysłane tradycyjnym zewnętrznym mechanizmem , zmienne PHP_AUTH nie będą ustawiane , jeśli dla danej strony aktywna jest autoryzacja zewnętrzna . W tym wypadku , aby uzyskać nazwę użytkownika zautoryzowanego zewnętrznie , należy skorzystać ze zmiennej REMOTE_USER . Zatem , $_SERVER[ 'REMOTE_USER' ] .

Konfiguracja : Aby wykryć czy miała miejsce zewnętrzna autoryzacja , PHP sprwadza obecność dyrektywy AuthType . Pamiętaj zatem , by nie stosować tej dyrektywy w miejscach , gdzie będzie używana autoryzacja PHP . Inaczej każda próba autoryzacji zakończy się niepowodzeniem .

Powyższa metoda nie zapobiega jednak wykradaniu haseł do stron wymagających autoryzacji przez kogoś , kto na tym samym serwerze kontroluje strony nie wymagające autoryzacji .

Zarówno Netscape Navigator jak i Internet Explorer opróżnią bufor autoryzacji po otrzymaniu od serwera kodu 401 . Można w ten sposób wylogowanić użytkownika i zmusić go do ponownego wysłania nazwy użytkownika i hasła . Tej metody można użyć do wylogowania użytkownika po określonym czasie lub stworzenia przycisku " Wyloguj " .

Przykład 16-2 . Autoryzacja HTTP z wymuszeniem przelogowania





 
Basic

 
realm="

 
Testowy

 
system

 
autoryzacji"')

 
;

 
header('HTTP

 
/

 
1.0 401

 
Unauthorized')

 
;

 
echo

 
"Musisz

 
podać

 
poprawny

 
login

 
i

 
hasło

 
by

 
wejść

 
na

 


 
stronę\n"

 
;

 
exit

 
;

 
  }

 
if

 
(!isset($_SERVER['PHP_AUTH_USER']

 
)

 
|

 
|

 
($_POST['SeenBefore'

 
]

 
==

 
1

 
$_POST['OldAuth'

 
]

 
==

 
$_SERVER['PHP_AUTH_USER'])

 
)

 
{

 
authenticate()

 
;

 
}

 
else

 
{

 
echo

 
"

 
p

 
Witaj

 
:

 
{$_SERVER['PHP_AUTH_USER']

 
}

 
br

 
"

 
;

 
echo

 
"Poprzenio

 
:

 
{$_REQUEST['$OldAuth']}"

 
;

 
echo

 
"

 
form

 
action='{$_SERVER['PHP_SELF']}

 
'

 
METHOD='POST

 
'

 
\n"

 
;

 
echo

 
"

 
input

 
type='hidden

 
'

 
name='SeenBefore

 
'

 
value='1

 
'

 
\n"

 
;

 
echo

 
"

 
input

 
type='hidden

 
'

 
name='OldAuth

 
'

 
value='{$_SERVER['PHP_AUTH_USER']}

 
'

 
\n"

 
;

 
echo

 
"

 
input

 
type='submit

 
'

 
value='Re

 
Authenticate

 
'

 
\n"

 
;

 
echo

 
"

 
/

 
form

 
/

 
p

 
\n"

 
;

 
  }

 
?





Powyższa metoda nie jest wymagana przez autoryzację HTTP typu " Basic " , więc nie można na niej polegać . Testy z przeglądarką Lynx pokazały , że Lynx nie usuwa danych o autoryzacji po odebraniu od serwera kodu 401 , zatem przejście wstecz a następnie do przodu otworzy stronę , chyba , że wymagania co do danych autoryzacji zmieniły się . Użytkownik może jednak użyć klawisza ' _ ' by usunąc dane o autoryzacji .

Autoryzacja HTTP nie działa jeśli używasz serwera Microsoft IIS i PHP w wersji CGI . Powodem pewne ograniczenia IIS .

Notatka : Jeśli włączony jest tryb bezpieczny , uid skryptu jest doklejany do pola realm nagłówka WWW-Authenticate .