1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
<?xml version="1.0" encoding="iso-8859-2"?>
<!-- EN-Revision: 1.21 Maintainer: slawek Status: ready -->
<!-- $Revision: 1.10 $ -->
<chapter id="features.http-auth">
<title>Autoryzacja HTTP w PHP</title>
<simpara>
Autoryzacja HTTP jest obsugiwana przez PHP tylko wtedy, gdy PHP pracuje
jako modu Apache'a, nie jest dostpna w trybie CGI. W skrypcie mona uy
funkcji <function>header</function> by wysa do przegldarki komunikat
"Wymagana autoryzacja", co spowoduje wywietlenie okienka z polami
Uytkownik i Haso. Po wypenieniu przez uytkownika tych pl, URL
zawierajcy skrypt PHP zostanie ponownie wywoany ze zmiennymi
$PHP_AUTH_USER, $PHP_AUTH_PW i $PHP_AUTH_TYPE zawierajcymi odpowiednio
nazw uytkownika, haso i typ autoryzacji. Obecnie obsugiwany jest
jedynie typ "Basic". Wicej informacji znajdziesz w opisie funkcji
<function>header</function>.</simpara>
<para>
Przykadowy skrypt wymuszajcy autoryzacj klienta:
<example>
<title>Autoryzacja HTTP</title>
<programlisting role="php">
<![CDATA[
<?php
if (!isset($PHP_AUTH_USER)) {
header("WWW-Authenticate: Basic realm=\"My Realm\"");
header("HTTP/1.0 401 Unauthorized");
echo "Tekst do wysania, jeli uytkownik wcinie przycisk Anuluj\n";
exit;
} else {
echo "<p>Hej $PHP_AUTH_USER.</p>";
echo "<p>Twoje haso to $PHP_AUTH_PW.</p>";
}
?>
]]>
</programlisting>
</example></para>
<note>
<para>
Naley uwaa z linijkami dodawanymi do nagwka HTTP. W celu zachowania
maksymalnej zgodnoci ze wszystkimi klientami, sowo Basic powinno
zaczyna si du liter "B", warto realm powinna by otoczona
cudzysowami (nie apostrofami), i dokadnie jeden znak odstpu powinien
poprzedza kod 401 w linii "HTTP/1.0 401".
</para>
</note>
<para>
Zamiast wywietla wartoci $PHP_AUTH_USER i $PHP_AUTH_PW, zapewne
zechcesz sprawdzi poprawno nazwy uytkownika i hasa. Na przykad
poprzez zapytanie do bazy danych lub odnalezienie uytkownika w pliku dbm.
</para>
<para>
Naley uwaa na kapryne przegldarki Internet Explorer. S wraliwe na
kolejno wysyanych nagwkw HTTP. Wysanie nagowka
<emphasis>WWW-Authenticate</emphasis> przed
<literal>HTTP/1.0 401</literal> powinno rozwiza problem.
</para>
<simpara>
Aby zapobiec sytuacji w ktrej kto napisze skrypt wykradajcy haso
wysane tradycyjnym zewntrznym mechanizmem, zmienne PHP_AUTH nie bd
ustawiane, jeli dla danej strony aktywna jest autoryzacja zewntrzna.
W tym wypadku, aby uzyska nazw uytkownika zautoryzowanego zewntrznie,
naley skorzysta ze zmiennej $REMOTE_USER.
</simpara>
<note>
<para>
Aby wykry czy miaa miejsce zewntrzna autoryzacja, PHP sprwadza
obecno dyrektywy <literal>AuthType</literal>. Pamitaj zatem, by
nie stosowa tej dyrektywy w miejscach, gdzie bdzie uywana autoryzacja
PHP. Inaczej kada prba autoryzacji zakoczy si niepowodzeniem.
</para>
</note>
<simpara>
Powysza metoda nie zapobiega jednak wykradaniu hase do stron wymagajcych
autoryzacji przez kogo, kto na tym samym serwerze kontroluje strony nie
wymagajce autoryzacji.
</simpara>
<simpara>
Zarwno Netscape Navigator jak i Internet Explorer oprni bufor
autoryzacji po otrzymaniu od serwera kodu 401. Mona w ten sposb
wylogowani uytkownika i zmusi go do ponownego wysania nazwy uytkownika
i hasa. Tej metody mona uy do wylogowania uytkownika po okrelonym
czasie lub stworzenia przycisku "Wyloguj".
</simpara>
<simpara></simpara>
<example>
<title>Autoryzacja HTTP z wymuszeniem przelogowania</title>
<programlisting role="php">
<![CDATA[
<?php
function authenticate() {
header( "WWW-Authenticate: Basic realm=\"Testowy system autoryzacji\"");
header( "HTTP/1.0 401 Unauthorized");
echo "Musisz poda poprawny login i haso by wej na t stron\n";
exit;
}
if (!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !strcmp($OldAuth, $PHP_AUTH_USER))) {
authenticate();
}
else {
echo "<p>Witaj: $PHP_AUTH_USER<br>";
echo "Poprzenio: $OldAuth";
echo "<form action='$PHP_SELF' METHOD='POST'>\n";
echo "<input type='hidden' name='SeenBefore' value='1'>\n";
echo "<input type='hidden' name='OldAuth' value='$PHP_AUTH_USER'>\n";
echo "<input type='submit' value='Re Authenticate'>\n";
echo "</form></p>\n";
}
?>
]]>
</programlisting>
</example>
<simpara>
Powysza metoda nie jest wymagana przez autoryzacj HTTP typu "Basic",
wic nie mona na niej polega. Testy z przegldark Lynx pokazay, e
Lynx nie usuwa danych o autoryzacji po odebraniu od serwera kodu 401,
zatem przejcie wstecz a nastpnie do przodu otworzy stron, chyba, e
wymagania co do danych autoryzacji zmieniy si. Uytkownik moe jednak
uy klawisza '_' by usunc dane o autoryzacji.
</simpara>
<simpara>
Autoryzacja HTTP nie dziaa jeli uywasz serwera Microsoft IIS i
PHP w wersji CGI. Powodem s pewne ograniczenia IIS.
</simpara>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
|