236 PHP i MySQL dla każdego
W rozdziale 7. został przedstawiony skrypt, który umożliwiał wyposażenie witryny internetowej w prosty mechanizm logowania. Dane dotyczące nazw oraz haseł użytkowników były zapisywane w pliku tekstowym, a skrypt porównywał je z danymi wprowadzonymi do formularza logowania. Jeśli występowała zgodność, była wczytywana właściwa wersja strony zapisana w oddzielnym pliku HTML; jeśli zaś zgodności nie było, wczytywany był jeden z plików HTML z opisem błędu.
Podstawową wadą takiej realizacji uwierzytelniania jest to, że po pierwotnej weryfikacji danych dostęp do dalszej części witryny jest już nieograniczony. Jeśli osoba postronna poznałaby strukturę plików składających się na witrynę (a wystarczy dowiedzieć się, jaką nazwę ma główny plik strony, do którego dostęp uzyskiwany jest z poziomu skryptu login.php), uzyskałaby pełny dostęp bez konieczności podawania hasła. Skoro bowiem skrypt logowania znajdował się pod adresem http://localhoslZlogin.php, a strona główna pod adresem http://localhost/indexl.html, to wystarczyło wpisanie tego drugiego adresu do przeglądarki, aby ominąć cały mechanizm logowania.
Jeśli jednak wykorzystamy poznaną w tym rozdziale wiedzę dotyczącą mechanizmów sesji, możemy stworzyć o wiele bezpieczniejszy mechanizm logowania, którego nie da się tak łatwo ominąć. Musimy jednak liczyć się z tym, że kod witryny będzie znacznie bardziej rozbudowany. Do przechowywania oraz weryfikacji nazw i haseł użytkowników użyjemy mechanizmu poznanego podczas pracy nad przykładem z rozdziału 7. Wszystkie dane będą przechowywane w pliku tekstowym o nazwie passwords.txt (w rozdziale 10. poznamy techniki umożliwiające przechowywanie haseł w bazie danych). Identycznie działać będzie również funkcja checkPass dokonująca ich weryfikacji.
Witryna będzie się składała z czterech części:
1. skryptu login.php realizującego procedurę logowania (listing 8.8),
2. pliku form.php zawierającego kod formularza logowania (listing 8.9),
3. pliku main.php zawierającego główną część witryny, dostępną jedynie dla załogowanych użytkowników (listing 8.10),
4. skryptu logout.php zawierającego procedurę wylogowania (listing 8.11).
Listing 8.8. Treść skryptu login.php zawierającego główną procedurę logowania
<?php
function checkPass($user, Spass)
<
if(!$fd = @fopen("passwords.txt", "r")) return 1:
Sresult - 2: while (Ifeof ($fd)){
$line = trim<fgets($fd)):
$arr = explode(":”. Sline): if(count($arr) < 2) continue:
if($arr[0] !■ $user) continue: