Uwierzytelnianie w PHP 01 Jednym z najważniejszych zagadnień, z którym może się zetknąć twórca stron internetowych, jest identyfikacja i uwierzytelnienie uprzywilejowanego użytkownika. Od zaprojektowania poprawnego systemu ograniczenia dostępu do zastrzeżonych treści i narzędzi często zależy powodzenie całego przedsięwzięcia, jakim jest stworzenie serwisu internetowego. Należy przy tym pamiętać, że system musi być z jednej strony bezpieczny, ale z drugiej funkcjonalny. Nie sposób wyobrazić sobie serwis, który ciągle żąda od użytkownika identyfikacji oraz wpisywania loginu i hasła przy wysyłaniu każdego kolejnego żądania. Ponieważ każde zagadnienie najlepiej jest zgłębiać od podstaw, w artykule najpierw omówimy mechanizm uwierzytelniania wbudowany w HTTP, a potem zbudujemy prosty system kontroli sesji za pomocą PHP. Podstawowa metoda uwierzytelniania (protokół HTTP) 03 Autoryzacja HTTP z poziomu PHP 09 Fazy procesu uwierzytelniania 12 Protokół HTTPS 12 Tworzenie sesji i jej zabezpieczenie 16 Bezpieczne przechowywanie danych sesji 18 O czym warto pamiętać 38 BBP 404 autor marcin Hubert informatyk, programista PHP Małopolskie Kuratorium Oświaty Instalacja i konfiguracja Zastosowania Kompendium Narzędzia
02 Uwierzytelnianie w PHP Zanim zaczniemy projektować nasz system kontroli sesji w PHP, odpowiedzmy sobie na pytanie, czym jest uwierzytelnianie. To hierarchia warunków i czynności koniecznych do ich spełnienia (nie jest to ścisła definicja!) mająca na celu potwierdzenie tożsamości użytkownika. Zagadnienie uwierzytelniania jest tak podstawowe, że zostało zaimplementowane już na poziomie protokołu HTTP. Korzystając wyłącznie z plików.htaccess, możemy ograniczać dostęp do wybranych katalogów lub dokumentów, udostępniając ich zawartość tylko tym osobom, które znają właściwy login oraz hasło. Login i hasło stanowią parę będącą czymś w rodzaju elektronicznej legitymacji członkowskiej, dającej posiadaczowi prawo dostępu do chronionych zasobów. Uwierzytelnianie z poziomu protokołu HTTP jest proste i skuteczne, jednak zapewnia tylko absolutne minimum funkcjonalności i dlatego ma ograniczone zastosowania. Stosowanie języka PHP daje twórcom serwisów znacznie więcej możliwości. Jednak wszystko ma swoją cenę: większa funkcjonalność to także furtka dla przeprowadzania ataków mających na celu zawładnięcie elektroniczną osobowością użytkownika i uzyskanie przez włamywacza dostępu do poufnych danych. Dlatego zgodnie z podaną przeze mnie definicją proces uwierzytelniania stanowi całą hierarchię warunków, które należy spełnić, aby zostać uznanym za osobę wiarygodną z odpowiednio wysokim stopniem prawdopodobieństwa. Jednak zawsze należy pamiętać, że żadne metody nie są w stanie zapewnić nam całkowitego bezpieczeństwa. Im bardziej złożony system zabezpieczeń, tym większej determinacji i wiedzy wyma-
Uwierzytelnianie w PHP 03 ga jego obejście, żaden nie stanowi jednak bariery nie do pokonania. Ponadto zagrożeniem są nie tylko próby pokonania systemu zabezpieczeń z zewnątrz. Wszelkie tego typu systemy są bardzo narażone na błędy programistów, także w samej swojej logicznej warstwie (częste są omyłki, polegające na tym, że pewna sekwencja zdarzeń w systemie powoduje uwiarygodnienie użytkownika, który podał błędne hasło lub nieistniejący login). Podstawowa metoda uwierzytelniania Protokół HTTP posiada wbudowany mechanizm pozwalający przeprowadzić uwierzytelnianie. Omówimy sposób jego wykorzystania na przykładzie modułu mod_auth serwera Apache, który jest instalowany domyślnie wraz z serwerem. Serwer korzysta z plików.htaccess, które można umieszczać w dowolnych katalogach. Pliki te pozwalają na wprowadzanie dodatkowych opcji konfiguracyjnych, obowiązujących jedynie w danym katalogu wraz z jego podkatalogami. Jednym spośród wielu zastosowań tych plików jest ograniczanie dostępu do wybranego katalogu. Serwer zezwala na dostęp jedynie uwierzytelnionym użytkownikom. Ponieważ uwierzytelnianie polega na porównaniu wprowadzonego loginu i przypisanego do niego zaszyfrowanego hasła z przechowywanym wzorem, zaczniemy od przygotowania pliku zawierającego informacje o użytkownikach uprawnionych do uzyskiwania dostępu do danego katalogu. Loginy i hasła można przechowywać w pliku o dowolnej nazwie. Tradycyjnie stosuje się nazwę.htpass, ponieważ w domyślnej konfiguracji serwer Pierwsza linia obrony plik.htaccess
04 Uwierzytelnianie w PHP nie udostępnia zawartości plików zaczynających się od prefiksu.ht. Ale nie ma powodu, aby nie stosować własnych nazw. To nie nazwa, a lokalizacja pliku ma podstawowe znaczenie. Plik ten nie może być umieszczony w chronionym hasłem katalogu, gdyż serwer nie pozwoliłby na odczytanie jego zawartości w celu porównania wprowadzonych przez użytkownika danych. Najprostszym rozwiązaniem jest umieszczenie go tuż powyżej chronionego katalogu. Jest to jednak ryzykowne, szczególnie gdy nazwa naszego pliku nie zaczyna się od.ht, ponieważ tak zlokalizowany plik mógłby zostać odczytany. Dlatego należy koniecznie umieścić go poza drzewem katalogów serwera WWW, aby uniemożliwić jego pobranie za pomocą serwera. Jeśli przyjmiemy, że katalog /home/marcin/www jest podlinkowany jako główny katalog serwera /, to plik.htpass (lub inny) możemy umieścić np. w naszym katalogu domowym: /home/ marcin/.htpass. Wygenerowanie takiego pliku jest bardzo łatwe: korzystamy z narzędzia htpasswd dołączonego do serwera Apache. Przykład utworzenie nowego pliku z hasłami o nazwie plik_hasel: > htpasswd -bc plik_hasel marcin Haslo Adding password for user marcin Opcja -bc powoduje utworzenie nowego, lub zamazanie starego pliku o podanej nazwie. W pliku tym zostanie zapisana para user:password w postaci zwykłego tekstu. Oczywiście hasło zostało zahaszowane algorytmem md5 (domyślnie). W naszym przykładzie po otwarciu pliku plik_hasel w dowolnym edytorze zobaczymy: marcin:wgtmz.tpacahc
Niedostępne w wersji demonstracyjnej. Zapraszamy do zakupu pełnej wersji książki w serwisie