Z powodu prac konserwacyjnych serwisu chwilowo nie ma możliwości dodawania nowych treści. Dziękujemy za wyrozumiałość. W razie pytań: YouthCoders.net@gmail.com


: Home / PHP / artykuły / Logowanie w PHP - część pierwsza
Logowanie w PHP - część pierwsza
Ocena użytkowników: / 1
SłabyŚwietny 
Wpisany przez Tomasz Stasiak   
piątek, 22 kwietnia 2011 22:02

Logowanie w PHP

W tym tutorialu postaram się opisać, jak w prosty sposób stworzyć logowanie na stronie. Jest ono przydatne, np. gdy chcemy udostępnić jakieś informacje
lub funkcjonalność tylko zarejestrowanym użytkownikom – np. dać możliwość dodawania nowości, zdjęć etc. Potrzebne będą:

  • Serwer z obsługą PHP, np. WAMP lub XAMPP lub konto hostingowe
  • Podstawowe wiadomości dotyczące PHP i HTML
  • W dalszej części dodatkowo serwer MySQL
  • Zapał do pracy :)

Tekst został podzielony na dwie części: logowanie z użyciem plików tekstowych, oraz z użyciem bazy danych MySQL, gdzie także zostanie umieszczone porównanie obu sposobów. Pomijam tu element konfiguracji serwera jak i bazy danych, jako iż było to opisywane w sieci wiele razy i nie dotyczy tego tekstu.

Część pierwsza – logowanie z użyciem plików tekstowych

Na początku będziemy potrzebowali trzech plików: login.php – zawierającego formularz logowania, db.php – zawierającego informacje o użytkownikach, oraz secret.php – czyli pliku, który chcemy zabezpieczyć przed wścibskimi użytkownikami.

Zaczynamy – tworzymy plik login.php i umieszczamy w nim nasz formularz z danymi, które musi wpisać użytkownik, aby uzyskać dostęp do tajnego pliku:

http://ideone.com/4Wmqm

Jak widać powyżej, w formularzu zostały umieszczone 2 pola: user, czyli nazwa użytkownika oraz passwd, czyli hasło tegoż użytkownika. Następnie musimy stworzyć bazę danych zawierającą dane użytkowników (plik db.php):

http://ideone.com/vldGC

Kilka słów wyjaśnień: w pierwszej linii otwieramy kod PHP i sprawdzamy (funkcja defined()), czy stała SECRET_CONST jest zadeklarowana. Jeśli nie – zostanie wywołana funkcja die(), która kończy wykonanie skryptu. Jest to zabezpieczenie przed odczytaniem przez niepowołanych użytkowników zawartości tego pliku oraz przed próbą dołączenia go do niepowołanego skryptu. Jest to skrócona forma, wykorzystująca pewne cechy języka PHP, równie dobrze można by tę linię zapisać w taki sposób:

http://ideone.com/qOxnM

Lecz, jak widać tamten kod jest znacznie krótszy. Dalej mamy definicję dwuwymiarowej tablicy – pierwsza kolumna oznacza ID użytkownika (w wypadku pozostawienia pustego nawiasu ID będzie ustalane automatycznie od 0). Druga kolumna oznacza odpowiednio nazwę użytkownika (pole user) oraz jego hasło (pole passwd), które jest zakodowane za pomocą wybranej funkcji haszującej (w tym wypadku SHA-256) – w tym wypadku hasz odpowiada hasłu „adminpasswd”. Jest to niezbędne, gdyż zabezpiecza nas w dużym stopniu przed uzyskaniem nieautoryzowanego dostępu nawet w wypadku wykradzenia pliku z informacjami o użytkownikach (patrz: mój artykuł o bezpieczeństwie danych osobowych w serwisach internetowych, a w szczególności sekcja dot. odzyskiwania haseł). Dodanie następnego użytkownika ogranicza się do skopiowania drugiej i trzeciej linii oraz zmianie nazwy użytkownika i hasła. Do wygenerowania haszu z hasła można skorzystać z dostępnych w Internecie narzędzi, np. http://www.insidepro.com/hashes.php.

Pozostał jeszcze jeden plik – secret.php, do którego dostęp ma być ograniczony. Oto elementy, które musi zawierać:

  • Definicja naszej stałej SECRET_CONST, dzięki której będziemy mogli skorzystać z naszej bazy danych
  • Sprawdzenie, czy użytkownik istnieje w bazie danych
  • Zapisanie w sesji informacji o tym, że użytkownik ma prawo do dostępu (aby nie trzeba było się logować po każdym odświeżeniu strony)
  • Wyświetlenie naszej tajnej treści

Zabieramy się do pracy – tworzymy plik secret.php o następującej treści:
http://ideone.com/gkQuP

Wyjaśnienie linijka po linijce: na początku otwieramy tag PHP aby móc wykonać nasz kod, w następnej linii rozpoczynamy sesję, aby można było z niej korzystać. Następnie definiujemy naszą stałą SECRET_CONST, która umożliwi nam korzystanie z bazy użytkowników; w czwartej i piątej linii upewniamy się, czy aby na pewno użytkownik wpisał dane do formularza i czy nie jest już przypadkiem zalogowany, jeśli nie – wyświetlamy odpowiedni komunikat oraz kończymy działanie skryptu. Jeśli już jesteśmy upewnieni, że użyszkodnik użytkownik wpisał dane do formularza lub jest zalogowany możemy przystąpić do sprawdzania poprawności wpisanych przez niego danych. Dołączamy plik z informacjami o użytkownikach (dyrektywa include()) oraz w pętli for() sprawdzamy, dane wszystkich użytkowników (do czasu napotkania prawidłowych danych). Jeśli użytkownik podał prawidłowe dane, ustawiamy wartość $_SESSION[‘logged_in’] na true, aby oznaczyć informację o tym, że użytkownik został zalogowany. W następnej sekcji kodu PHP (wewnątrz sekcji HTML BODY) sprawdzamy, czy użytkownik jest zalogowany; jeśli tak – wyświetlamy naszą tajną treść, jeśli nie – także odpowiedni komunikat.

To by było na tyle – w następnej części opiszę jak wykonać logowanie z wykorzystaniem bazy danych MySQL.

 

//edit: paczka z kodem do pobrania

 

Komentarze 

 
-1 #28 orenieree 2012-01-28 03:29
When will the new series of Doctor Hausa?
prednisone
Cytować
 
 
-1 #27 2011-09-23 01:56
as a rest this summer?
viagra
Cytować
 
 
0 #26 Patryk yarpo Jar 2011-05-05 08:49
@Tomasz: proponuję raczej nie przyznawać się już, że w artykule dajesz niesprawdzone kody :)
Cytować
 
 
+1 #25 Tomasz Stasiak 2011-05-04 21:10
@AndySad - ad1. dzięki, zapomniałem jakoś o tym przycisku logowania ;]
ad2. tu także skleroza, tak to jest, jak człowiek coś robi bez przetestowania działania.. ;/
BTW mogłeś napisać w 1 poście
Cytować
 
 
+1 #24 AndySad 2011-05-04 18:27
w pliku db.php powinno raczej być:
$db[0]['user'] = 'admin';
$db[0]['passwd'] = 'f7715d0d4a1546213ce3e9ab6fd90581b1f3a2e3c0d42d2e4a31ddeed89ad632';
Cytować
 
 
+1 #23 AndySad 2011-05-04 18:26
brakuje
<input type="submit" name="Przycisk" value="Zaloguj">
Cytować
 
 
0 #22 Patryk yarpo Jar 2011-04-27 00:41
@Teo: masz rację
@Tomasz: masz rację

@Janek: chodzi o https://bitbucket.org/yarpo/youthcoders/issue/12/edytor-od-frontu-zjada-kod-html a nie o wyświetlanie. Problem już dawno zdiagnozowany. Joomla perfidnie [i nie bójmy się użyć tego słowa - wrednie :P] zżera nam dowolne tagi umieszczone [TYLKO od frontu, od tyłu działa dobrze] w artykule.
Cytować
 
 
0 #21 Jan Jackowicz-Korczyński 2011-04-26 21:18
Cytat:
Racja, z HTMLem jest koszmar :)

Ale pozostałe kody naprawdę wstawia się całkiem normalnie :)

Co do HTML jest to wina Joomli. Wydaje się być bardzo ułomna w tej kwestii :/

Codecitation ma zdefiniowane filtry klasy brush dla: AS3, Bash, Cpp, CSharp, Css, Delphi, Diff, Grovvy, Java, JavaFX, JScript, Perl, PHP, Plain, PowerShel, Python, Ruby, Scala, Sql, Vb, Xml.
Jak ktoś potrzebuje więcej to trzeba dopisać odpowiednie definicje w folderze: plugins/content/codecitation/js
Myślę, że dla HTML wystarczy używać: class=brush: Xml
Cytować
 
 
+1 #20 Tomasz Stasiak 2011-04-26 19:14
Nie żebym coś mówił, ale wprowadzanie szablonów (których zapewne większość nie zna - a prawie na pewno wszyscy z grupy docelowej tego tekstu) w tutorialu opisującym stworzenie naprawdę prostego logowania chyba nie jest najlepszym pomysłem... Czy nie uważasz, że najpierw powinno się poznać podstawy, a później dopiero zabierać za coś tak skomplikowanego jak smarty, czy frameworki? (no dobra, spotkałem osoby, które zabierały się za frameworki MVC nie mając pojęcia o OOP..)
Poza tym, czy mieszanie kodu HTML i PHP jest aż tak wielkim grzechem? Omijając fakt, że niektóre fw (zend) czy szablony (smarty) do demonów szybkości nie należą
Cytować
 
 
+1 #19 Teodor Woźniak 2011-04-26 17:55
Mieszanie kodu PHP i HTML w jednym pliku nie jest najlepszym pomysłem, OK jeśli to mała księga gości czy coś w tym stylu ale jak się rozrośnie to będzie problem. Polecam napisać coś bardziej skalowalnego, korzystając z gotowych frameworków, a jeśli frameworków nie chcemy (jak np. ja ;) ) to chociaż z zarządcy szablonów typu Smarty.
Cytować
 

Dodaj komentarz


Kod antysapmowy
Odśwież