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
.
Są
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
tę
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
są
pewne
ograniczenia
IIS
.
Notatka
:
Jeśli
włączony
jest
tryb
bezpieczny
,
uid
skryptu
jest
doklejany
do
pola
realm
nagłówka
WWW-Authenticate
.