Sesje - Podstawy PHP. Sesje. Artykuł pobrano ze strony eioba.pl. Wprowadzenie do sesji. Prosta autoryzacja użytkowników

Podobne dokumenty
Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Baza danych do przechowywania użytkowników

Aplikacje WWW - laboratorium

Wprowadzenie do Internetu Zajęcia 5

Aplikacje internetowe - laboratorium

Systemy internetowe. Wykład 3 PHP. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Dokumentacja smsapi wersja 1.4

Jednym z najważniejszych zagadnień, z którym może się zetknąć twórca

WINDOWS Instalacja serwera WWW na systemie Windows XP, 7, 8.

Internetowe bazy danych

Instrukcja instalacji PHP-Hypercachera Refresher Standard oraz PHP-Hypercachera Refresher GZIP na Twojej witrynie

6. Bezpieczeństwo przy współpracy z bazami danych

Polityka prywatności dla strony ELCEN Sp. z o.o. z siedzibą w Gdyni

Sesje i logowanie. 1. Wprowadzenie

e-wsparcie Barbara Muszko Aktualizacja Twojej witryny internetowej tak prosta, jak obsługa Worda

Zajęcia 11 wykorzystanie MySQL w PHP

Dokumentacja interfejsu HTTPD. Platforma BSMS.PL Instrukcja podłączenia po przez http

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

Języki programowania wysokiego poziomu. PHP cz.3. Formularze

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Rejestracja i Logowania - PHP/MySQL

Polityka prywatności w serwisie internetowym IPN

REFERAT O PRACY DYPLOMOWEJ

Ogólnopolskie Repozytorium Prac Dyplomowych

jako integralna część Regionalnego Systemu Informacji Przestrzennej (RSIP)

Instrukcja pierwszego logowania do EBO - aplikacja kliencka oraz migracji kontrahentów i szablonów z KIRI do EBO.

Wysyłanie pliku na serwer. Plik na serwerze.

Stosowanie ciasteczek (cookies)

Internetowy moduł prezentacji WIZYT KLIENTA PUP do wykorzystania np. na stronie WWW. Wstęp

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

14. POZOSTAŁE CIEKAWE FUNKCJE

SMS Kod Automatyczny

Systemy internetowe Wykład 3 PHP

Aplikacje internetowe

Technologia Flash cieszy się coraz większą popularnością. Liczba dostępnych

Aplikacje WWW - laboratorium

Sklep internetowy wtspartner.pl dokłada wszelkich starań, aby prowadzony serwis ułatwiał każdemu użytkownikowi

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki

Spis treści REJESTRACJA NOWEGO KONTA UŻYTKOWNIKA PANEL ZMIANY HASŁA PANEL EDYCJI DANYCH UŻYTKOWNIKA EXTRANET.NET...

Oświadczenie o plikach cookies

timetrack Przewodnik Użytkownika timetrack Najważniejsze Funkcje

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

Moduł Notatki Systemu Obsługi Zamówień Publicznych UTP-Bydgoszcz Instrukcja postępowania do 1000 Euro

World Wide Web? rkijanka

POLITYKA PRYWATNOŚCI SERWIS:

Publikacja zdjęć w sieci wykorzystanie Picasa Web Albums

INSTRUKCJA zakładania konta w Społecznoś ci CEO

Fundacja Ośrodka KARTA z siedzibą w Warszawie, przy ul. Narbutta 29 ( Warszawa),

Wstęp. Skąd pobrać program do obsługi FTP? Logowanie

Personal Home Page PHP: Hypertext Preprocessor

Instrukcja do platformy internetowej Art-Aktywator. Instrukcja do platformy internetowej Art-Aktywator

POLITYKA PRYWATNOŚCI ORAZ POLITYKA PLIKÓW COOKIES W Sowa finanse

Gerard Frankowski, Zespół Bezpieczeństwa PCSS. Nowoczesne technologie bliżej nas Poznań,

Jeżeli tutaj trafiłeś, to niezawodny znak, że cenisz swoją prywatność. Doskonale to rozumiemy,

Platforma e-learningowa

Spis treści. 1. Wstęp 2. Rejestracja 3. Logowanie 4. Moje konto 5. Program poleconych 6. Narzędzia Wydawcy 7. Zakończenie

FTP przesył plików w sieci

Instrukcja obsługi systemu zarządzania treścią dwajeden.pl

Polityka prywatności 1. Definicje Administrator Cookies - Cookies Administratora - Cookies Zewnętrzne - Serwis - Urządzenie - Ustawa Użytkownik -


III. Opis działania systemu

Instrukcja używania oraz tworzenia kanałów RSS

I. Informacje ogólne. Jednym z takich systemów jest Mambo.

Opis systemu lojalnościowego e-lar bank.

instrukcja INSTALACJI APi_proxy


DESlock+ szybki start

Pliki cookies. Podczas wizyty na tej stronie używane są następujące pliki Cookies:

Ten krótki poradnik pomoże Ci zainstalować nasz katalog no-name na swojej stronie internetowej.

Instrukcja obsługi portalu MojeHR moduł pracownika

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Platforma e-learningowa

INSTRUKCJA. zakładania konta w Społeczności CEO oraz rejestrowania się do programu lub na szkolenie/cykl szkoleniowy KROK 1

PROGRAM PARTNERSKI.

Projekt strony internetowej firmy organizującej przyjęcia

PTV MAP&GUIDE INTERNET V2 ŁATWE PRZESTAWIENIE SIĘ

Opis instalacji oparto na przykładzie serwera SUPERHOST z obsługą PHP i MySQL.

Polityka prywatności Spółdzielni Mieszkaniowej Słoneczny Stok

Zintegrowane Systemy Zarządzania Biblioteką SOWA1 i SOWA2 ZAMAWIANIE I REZERWOWANIE

Instrukcja Użytkownika Systemu Zarządzania Tożsamością Wersja. 1.0

Backend Administratora

Gatesms.eu Mobilne Rozwiązania dla biznesu

Laboratorium 7 Blog: dodawanie i edycja wpisów

KatMPBSoft - 1 -

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

Internetowy serwis Era mail Aplikacja sieci Web

Przekierowanie portów w routerze - podstawy

Sprawozdanie nr 4. Ewa Wojtanowska

Jak publikować na MiMamo.pl

Polityka prywatności strony internetowej

Bezpieczeństwo systemów komputerowych

Pliki cookies. Jaki rodzaj Cookies jest używany? Podczas wizyty na tej stronie używane są następujące pliki Cookies:

Polityka prywatności. Obowiązująca do dnia r.

Transkrypt:

Artykuł pobrano ze strony eioba.pl Sesje - Podstawy PHP Sesje Protokół HTTP jest protokołem bezstanowym. Oznacza to, że serwer WWW rozpatruje każde żądanie niezależnie od innych, nie szukając żadnych powiązań w stylu wysyłania ich przez tego samego internautę. Utrudnia to teoretycznie tworzenie wszelkich systemów autoryzacji, które wymagają śledzenia poczynań użytkownika na naszej stronie i przenoszenia jego danych autoryzacyjnych między kolejnymi żądaniami, czyli krótko mówiąc - wymagają obecności systemu sesji. Używając PHP lub innego dynamicznego języka server-side można je jednak zasymulować. "Nasz" język jest o tyle prosty, iż posiada już zaimplementowane stosowne funkcje. My tylko musimy zacząć ich używać. Działanie sesji w PHP jest bardzo proste. W momencie pierwszego trafienia na stronę interpreter tworzy specjalny, losowy oraz unikalny identyfikator przesyłany między żądaniami za pomocą ciastek lub parametru PHPSESSID doklejanego automatycznie do adresów URL. Na jego podstawie odczytywany jest później odpowiedni plik z danymi sesji zapisany gdzieś na serwerze. Pod koniec przetwarzania żądania wszystkie wprowadzone przez skrypt zmiany są z powrotem zapisywane do wspomnianego pliku tak, aby były widoczne przy wejściu na kolejną podstronę. I tak to się toczy. Wprowadzenie do sesji Czas na trochę praktyki. Aby zainicjować mechanizm sesji, wystarczy wywołać funkcję session_start(), najlepiej na początku naszej aplikacji. Od tego momentu do naszej dyspozycji zostaje oddana super globalna tablica $_SESSION - wszystkie zapisane do niej dane są przesyłane między kolejnymi żądaniami. Popatrzmy na pierwszy, bardzo prosty przykład licznika odwiedzonych już podstron: // 1 if(!isset($_session['licznik'])) // 2 $_SESSION['licznik'] = ; $_SESSION['licznik']++; // 3 echo 'Odwiedziłeś już '.$_SESSION['licznik'].' podstron!'; // 4 Oto analiza: 1. 2. 3. 4. Inicjujemy sesje Jeżeli jest to pierwsza wizyta, tablica z sesjami nie zawiera żadnych danych. Dobrym zwyczajem jest ich inicjowanie, aby nie zostać zaatakowanym tysiącami komunikatów Notice. Zmieniamy dane sesji Odczytujemy dane sesji Po odświeżeniu strony zauważymy, że licznik wskazuje już "2", po kolejnym - "3". Oznacza to, że PHP zapisuje zmienną $licznik i przesyła ją między naszymi żądaniami. Różnica pomiędzy sesjami, a ciastkami jest taka, że dane te w ogóle nie opuszczają serwera WWW, są przez to (w teorii) bezpieczniejsze. Prosta autoryzacja użytkowników Napiszemy teraz prosty skrypt do autoryzacji użytkowników bazujący na sesjach. Jak wspomnieliśmy w poprzednim rozdziale, nie powinno się przesyłać pomiędzy żądaniami haseł oraz loginów użytkowników, nieważne czy w formie

ciastek, czy sesji. Alternatywą jest ich ID. Jak przekonasz się w następnych rozdziałach, bazy danych, gdzie większość aplikacji WWW trzyma swoje informacje, wcale nie identyfikują rekordów jakimiś abstrakcyjnymi rzeczami typu login lub tytuł. Operują na zwyczajnych, automatycznie nadawanych i unikalnych liczbach zwanych identyfikatorami (w skrócie pisze się "id"). Dzięki temu można szybko je do siebie porównać, co ma szczególne znaczenie w przypadku ogromnej ilości rekordów. Takie też ID przypisane użytkownikom przesyłane są w sesjach. Oczywiście, zgodnie z praktyką stosowaną w bazach danych, numerację rekordów rozpoczynamy od 1. Rekord o ID równym 0 nie istnieje. Zatem, jak taki system logowania działa? Kiedy sesja jest już załadowana, skrypt sprawdza zapisany w niej ID użytkownika. Jeżeli jest on większy od zera, ktoś jest już zalogowany i wystarczy tylko pobrać skądś dane jego profilu. W przypadku ID równego 0 mamy do czynienia z kimś anonimowym. Tu, w zależności od sytuacji możemy mu wyświetlać ogólnodostępne treści albo formularz logowania. Pisanie skryptu zaczniemy od stworzenia sobie namiastki bazy danych. Będzie nią tablica $uzytkownicy przechowująca loginy oraz hasła użytkowników. Ponadto napiszemy funkcję czyistnieje() znajdującą ID użytkownika o podanym loginie i haśle lub false, kiedy takowy nie istnieje. Hasła naturalnie haszujemy poznanym już algorytmem sha1: $uzytkownicy = array(1 => array('login' => 'user1', 'haslo' => sha1('ppp')), array('login' => 'user2', 'haslo' => sha1('ddd')), array('login' => 'user3', 'haslo' => sha1('fff')) ); function czyistnieje($login, $haslo) global $uzytkownicy; $haslo = sha1($haslo); foreach($uzytkownicy as $id => $dane) if($dane['login'] == $login && $dane['haslo'] == $haslo) // O, jest ktos taki - zwroc jego ID return $id; // Jeżeli doszedłeś a tutaj, to takiego użytkownika nie ma return false; // end czyistnieje(); Teraz zaczniemy właściwy skrypt. Zainicjujemy sesję i obsłużymy sytuację pierwszej wizyty - w takim wypadku gościa oznaczymy jako osobę anonimową (niezalogowaną): // Wlasciwy skrypt if(!isset($_session['uzytkownik'])) // Sesja się zaczyna, wiec inicjujemy użytkownika anonimowego $_SESSION['uzytkownik'] = ; Krótka piłka - ID większy od 0? Ktoś jest zalogowany: if($_session['uzytkownik'] > )

// Ktos jest zalogowany echo 'Witaj, '.$uzytkownicy[$_session['uzytkownik']]['login'].' na naszej stronie!'; Jednak jeśli nie jest, to musimy zaprogramować zarówno pokazywanie formularza logowania, jak i autoryzację użytkownika na podstawie danych z niego. Zaczynamy od tej drugiej opcji. Korzystając z funkcji czyistnieje() pobieramy ID użytkownika. Jeżeli jest on różny od false, wpisujemy go do sesji, tym samym logując go. // Niezalogowany if($_server['request_method'] == 'POST') if(($id = czyistnieje($_post['login'], $_POST['haslo']))!== false) // Logujemy uzytkownika, wpisal poprawne dane $_SESSION['uzytkownik'] = $id; echo 'Dziekujemy, zostales zalogowany! <a href="sesje_2.php">dalej</a>'; echo 'Podales nieprawidlowe dane, zegnaj! <a href="sesje_2.php">dalej</a>'; Kiedy dane nie nadeszły z formularza, znaczy to, że trzeba go wyświetlić: echo '<form method="post" action="sesje_2.php"> Zaloguj sie: <input type="text" name="login"/><input type="password" name="haslo"/> <input type="submit" value="ok"/></form>'; I gotowe. Wszystko fajnie, wszystko pięknie, nasza witryna sobie działa, użytkownicy się logują, dodając coraz to nowe treści, lecz pewnego dnia dostajesz e-maila z ostrzeżeniem, że ktoś włamał się do serwisu i wszystko rozwalił. Co nawaliło? Czyżby zawiódł mechanizm sesji? Bezpieczeństwo sesji Prawdopodobnie tak. Sytuacja z mechanizmem sesji standardowo dostępnym w PHP jest o tyle śmieszna, że jego autorzy właśnie nam zostawili swobodę działania odnośnie tego, jak go zabezpieczyć przed kradzieżą. Normalnie użyty jest on bowiem dziurawy, jak szwajcarskie sito. Kradzież sesji nie nastręcza wielkich trudności, lecz na nieszczęście, wiele osób o tym nie pamięta (także autorów artykułów pokazujących, jak z niego korzystać!). Włamania wykorzystujące dziury w mechanizmach sesji mają swoje fachowe nazwy. Pierwszą z nich jest Session Fixation. Jej działanie jest bardzo proste. Wykorzystujemy tutaj właściwość, że kiedy podamy skryptowi jakiś nieistniejący ID sesji, PHP automatycznie dorobi dane i nie przejmie się tym, że tak naprawdę to my go wygenerowaliśmy, a nie jakiś algorytm losująco-mieszający. Teraz popatrz: podszywasz się pod pracownika jakiegoś serwisu internetowego i każesz nieświadomemu użytkownikowi odwiedzić jakiśtam adres, najlepiej wymagający zalogowania. Do adresu URL doczepiasz ciąg?phpsessid=abcdef. "abcdef" jest wymyślonym przez nas identyfikatorem. Kiedy użytkownik posłusznie się zaloguje, jest zdany na naszą łaskę. Mamy ID jego sesji i możemy działać tak, jakbyśmy byli nim.jeszcze więcej cwaniactwa i możemy uzyskać nawet sesję administratora, co dla serwisu oznacza oczywiście katastrofę. Aby się przed tym zabezpieczyć, wystarczy po zainicjowaniu mechanizmu sesji dokleić bardzo prosty kod:

if (!isset($_session['inicjuj'])) session_regenerate_id(); $_SESSION['inicjuj'] = true; Przy tworzeniu nowej sesji, dzięki funkcji session_regenerate_id() mamy pewność, że sesja dostanie losowy ID. Teraz nawet, jeżeli podamy zmyślnie?phpsessid=abcdef, nic nam to nie da, bo PHP i tak sobie wszystko wygeneruje po swojemu i zostaniemy w tym samym miejscu, co byliśmy. Jednak nie spoczywaj jeszcze na laurach. ID nadal może zostać wykradziony. Wystarczy, że jakiś ciamajda skopiuje znajomemu link do jakiegoś zasobu, mając przy tym wyłączone ciastka. Oczywiście w linku znajdzie się wtedy jego LOSOWY identyfikator sesji, który w ten sposób zostanie ujawniony przed światem. Znajomy może teraz wędrować sobie po serwisie wykorzystując sesję ciamajdy. session_regenerate_id() tutaj nie zadziałała, bo przecież ta sesja już istnieje. Ataki tego rodzaju określa się mianem Session Hijacking. Zabezpieczenie się przed nimi także jest proste. Wystarczy w sesji przesyłać np. adres IP komputera wraz z nazwą przeglądarki, spod których została ona utworzona, a następnie porównywać je przy kolejnych wizytach z danymi dostarczonymi przez serwer. Jeżeli wystąpi niezgodność, ktoś próbuje użyć cudzej sesji. if (!isset($_session['inicjuj'])) session_regenerate_id(); $_SESSION['inicjuj'] = true; $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; if($_session['ip']!== $_SERVER['REMOTE_ADDR']) die('proba przejecia sesji udaremniona!'); Powyższy przykład zawiera łatki przeciwko obu włamaniom (co prawda w przypadku tej drugiej o wiele lepszym rozwiązaniem byłoby utworzenie sesji na nowo w przypadku niezgodności, niż obwieszczanie całemu światu naszego "odkrycia"). Pamiętaj jednak, że najsłabszym ogniwem jest zawsze człowiek. Jeżeli hacker zdobędzie twoje hasło, zabezpieczenia na nic się nie zdadzą, chyba że akurat masz stały adres IP i tak sobie wszystko napisałeś, że na twoje konto można się tylko z niego logować. Tylko kto stosuje tak rygorystyczne i nieporęczne środki bezpieczeństwa. Podsumowanie Sesje PHP są bardzo dobrym rozwiązaniem, jednak paradoksalnie wiele profesjonalnych aplikacji pisze własne systemy sesji całkowicie od zera. Powodów jest kilka: 1. Integracja ze strukturą kodu reszty aplikacji 2. Niezależność od PHP. Kiedy mechanizm sesji pojawił się w PHP po raz pierwszy, używało się go zupełnie inaczej, niż obecnie. Przyszłość może przynieść różne rzeczy, a nasz własny mechanizm zawsze pozostanie

mimo tego taki sam. 3. Bezpieczeństwo - kiedy piszesz wszystko od zera, możesz wstawić dodatkowe zabezpieczenia tam, gdzie normalnie nie sięgniesz. 4. Elastyczność - dlaczego dane sesji muszą być trzymane akurat w pliku? Baza danych jest przecież równie dobra, jeśli nie lepsza. 5. Specyfika zastosowania - wiele systemów sesji służy tylko celom autoryzacji. Stąd też pisze się je od zera pod to jedno zastosowanie, co umożliwia wprowadzenie pewnych uproszczeń oraz optymalizacji. Jednak własny system sesji jest odpowiedzialnym kawałkiem kodu, gdyż tam to ty musisz wszystko od A do Z zaprogramować. Na razie jedynie sygnalizujemy taką możliwość jako alternatywę dla systemu sesji wbudowanego w PHP. Który z nich wybierzesz, to zależy tylko od Ciebie. Treść pochodzi ze strony WikiBooks i jest udostępniana na licencji GNU FDL Autor: WikiBooks Artykuł pobrano ze strony eioba.pl