Podczas tworzenia różnego rodzaju skryptów, każdy programista w pewnym momencie dochodzi do miejsca, w którym pewne dane powinny być w jakiś sposób zabezpieczone przed nieodpowiednimi osobami. Doskonałym przykładem są panele administracyjne najrozmaitszych skryptów. Jedna z metod to stworzenie prostego formularza, którego zawartość analizuje nasz programik.
Informacje o użytkownikach można przechowywać na kilka sposobów. Gdy ich liczba jest duża najlepszym wyjściem wydaje się baza danych. Nie każdy ma taką bazę i nie każdy chce skorzystać z takiego rozwiązania. W takim wypadku alternatywnym rozwiązaniem są pliki, których format sami sobie możemy wymyślić. Inna sytuacja ma miejsce, gdy tylko niewielka liczba ludzi, w skrajnym przypadku jedna osoba, ma dostęp do haseł. Ich dane można, choć nie jest to najlepsze rozwiązanie, wpisać bezpośrednio do kodu. Bardziej efektymnym rozwiązaniem jest stworzenie okienka, w które wpisujemy login i hasło. Cała sprawa opiera się na wysłaniu odpowiedniego nagłówka do przeglądarki i sprawdzaniu odpowiednich zmiennych globalnych.
<?php
if (!isset($PHP_AUTH_USER)) {
header('WWW-Authenticate: Basic realm="Tajne miejsce"');
header('HTTP/1.0 401 Unauthorized');
echo 'Brak dostępu.';
exit;
} else if (isset($PHP_AUTH_USER)) {
if (($PHP_AUTH_USER != "admin") || ($PHP_AUTH_PW != "abc123")) {
header('WWW-Authenticate: Basic realm="Tajne miejsce"');
header('HTTP/1.0 401 Unauthorized');
echo 'Brak dostępu.';
exit;
} else {
echo "<P>Zalogowałeś się!</p>";
}
}
?> |
Ten skrypcik wyświetla okienko, w które należy wpisać login i hasło, ale tylko w przypadku gdy zmienna $PHP_AUTH_USER jest pusta. Jeśli login i hasło są dobre pojawia się komunikat, stwierdzający fakt zalogowania. Jest to najprostszy przykład, gdy istnieje tylko jeden użytkownik. Wartości zmiennych są porównywane z tymi wpisanymi na stałe do skryptu. Zmiana hasła wymaga zmiany kodu. Co jednak zrobić, gdy dane są przechowywane w pliku? Załóżmy, że nasz pliczek z hasłami ma naztępujący format login:hasło. W każdej linijce znajdują się informacje o innym użytkowniku, np.
jan:ai890d
adam:29hj0jk
ania:fsSS92
kasia:2NNg8ed
rysiu:a76zFs |
Kod PHP, wykonujący cały proces:
<?php
if (!isset($PHP_AUTH_USER)) {
header('WWW-Authenticate: Basic realm="Tajne miejsce"');
header('HTTP/1.0 401 Unauthorized');
exit;
} else if (isset($PHP_AUTH_USER)) {
$plik = "/sciezka/do/hasla.txt";
$fp = fopen($plik, "r");
$zawartosc = fread($fp, filesize($plik));
fclose($fp);
$linia = explode("\n", $zawartosc);
$i = 0;
while($i <= sizeof($linia)) {
$dane = explode(":", $linia[$i]);
if (($dane[0] == "$PHP_AUTH_USER") && ($dane[1] == "$PHP_AUTH_PW")) {
$auth = 1;
break;
} else {
$auth = 0;
}
$i++;
}
if ($auth == "1") {
echo "<p>Zalogowałeś się!</p>";
exit;
} else {
header('WWW-Authenticate: Basic realm="Tajne miejsce"');
header('HTTP/1.0 401 Unauthorized');
echo 'Brak dostępu';
exit;
}
}
?> |
Jak zwykle kilka słów wyjeśniania. Funkcja fopen() otwiera plik, ścieżkę do niego podawana jest jako pierwszy parametr to tryb w jakim plik jest otwierany. W naszym przypadku tylko do odczytu, bo przecież nie będziemy do niego nic zapisywać. Sprawdzamy tylko czy podany użytkowik istnieje. Nie wystarczy otworzyć plik, należy go jeszcze później odczytać, służy do tego funkcja fread(). Pierwszym parametrem jest link do pliku zwrócony przez poprzednią funkcję, drugim parametrem jest ilość odczytywanych bajtów. W naszym przypadku wszystkie, filesize() zwraca wielkość podanego pliku. W ten sposób cała treść pliku znajduje się w zmiennej $zawartosc. Explode() dzieli podany string, kolejne jego części są zapisywane do tablicy. Znak (znaki) według, którego dokonywany jest podział zostaje wyrzucony. Ponieważ dzielimy wg znaku końca linii, każdy element tablicy to osobna linia. Kolejne wywołanie explode() dzieli już linię na login i hasło użytkownika. Dane te są porównywane z wprowadzonymi i jeśli któraś para pasuje, pętla jest przerywana i ustawiana odpiednia zmienna ($auth). Jeśli jednak żadna para login, hasło nie pasuje zmienna ta ma wartość 0, co jest traktowane jako fałsz. Ot cała filozofia. Działania na bazie danych są jeszcze prostsze, bo nie trzeba sprawdzać wszystkich rekordów, tylko wybrać ten odpowieni. Jeśli ilość zwróconych rekordów (rzędów) jest równa 0, użytkownik nie istnieje.
---
Od redakcji: Artykuł ten już swoje lata ma i jeżeli będziesz miał problemy z autoryzacją, pamiętaj o innym tekście: "System wejścia w PHP", który również można znaleźć na Webcity.pl.