1 Teleinformatyka Wykład 7 Komunikacja klient-serwer – cd.
2 Metody: pliki – niewygodne, czasochłonneciasteczka "cookie" – na komputerze klienta bazy danych na serwerze - trwałe mechanizm sesji – dane nietrwałe, np. do czasu otwarcia przeglądarki
3 setcookie ( string nazwa [, string wartość] [, int data_ważności ])CIASTECZKA „cookies” setcookie (PHP 3, PHP 4 , PHP 5) setcookie -- Wysyła ciasteczko i zapisuje u klienta setcookie ( string nazwa [, string wartość] [, int data_ważności ]) setcookie() określa ciasteczko (ang. cookie) do wysłania z nagłówkami HTTP. Ciasteczko musi być wysłane zanim jakiekolwiek inne nagłówki zostaną wysłane (to jest ograniczenie ciasteczek, nie PHP). To wymaga umieszczenia wywołań tej funkcji przed znacznikami czy . Wszystkie argumenty (poza nazwą) są opcjonalne. Jeśli obecny jest tylko argument nazwa, ciasteczko o takiej nazwie zostanie usunięte z klienta. Można też opuścić argumenty za pomocą pustego łańcucha (""). Argument data_ważności jest liczbą całkowitą. Zamiast niego można użyć liczby zero (0). Argument data_ważności jest regularnym uniksowym znacznikiem czasu, takim jak zwracany przez funkcje time() lub mktime (). Wysłane ciasteczko jest dostępne już przy następnym załadowaniu strony w tablicy $_COOKIE. W PHP do była to tablica $HTTP_COOKIE_VARS.
4 Przykład 1. setcookie() wysyła przykładowe ciasteczka Częste pułapki: Tworzone skryptem ciasteczka nie będą widziane do następnego przeładowania strony dla której mają być widoczne. Ciasteczko może być usunięte tylko z tymi parametrami, z jakimi je ustawiono. Przykład 1. setcookie() wysyła przykładowe ciasteczka setcookie ("TestCookie", $value); setcookie ("TestCookie", $value,time()+3600); /* traci ważność za godzinę */ Aby skasować ciasteczko, należy ustawić datę ważności na datę w przeszłości, co uruchomi w przeglądarce mechanizm kasowania ciasteczek. Przykład 2. Kasowanie ciasteczek// np. ustawić datę ważności na godzinę wstecz setcookie ("TestCookie", "", time() ); Przykład 3. Sprawdzenie ciasteczka if (isset($_COOKIE["TestCookie"])) kod1; else kod2;
5 Licznik odwiedzin (czuły na odświeżanie strony) if (isset($_COOKIE['licznik'])) { $licz=$_COOKIE['licznik']; $licz++;} else { $licz = 1;} setcookie("licznik",$licz,time()+(3600*24*31)); echo "Odwiedziłeś tę stronę". $licznik." razy
"; echo"
"; var_dump($_COOKIE);//informacja o tablicy _COOKIE ?>
6 zwykle jest zapisany w cookie przekazywany przez URL-eSESJA Unikalny identyfikator generowany przez PHP, przechowywany po stronie klienta: zwykle jest zapisany w cookie przekazywany przez URL-e Natomiast dane sesji zapisywane po stronie serwera Przeglądarka przechowuje identyfikator sesji (jak bilet), odnajduje zmienne przechowywane na serwerze dla danej sesji. Pamięć sesji na serwerze – identyfikator u klienta
7 Obsługa sesji w PHP ma na celu zapewnienie sposobu na zachowanie pewnych danych w trakcie następujących po sobie wywołań strony – żądań HTTP (np. id klienta, danych w koszyku, numeru karty kredytowej). Wchodzący na stronę WWW otrzymuje unikalny identyfikator, tzw. id sesji (32 cyfry szesnastkowe), np: db2245f91a5a3dadd2010ba0172b sess_id() Pozwala na zgłoszenie zmiennych jako zmiennych sesji – przechowywanych na serwerze. Identyfikator sesji (PHPSESSID) jest jedyną wartością widoczną po stronie klienta – jeśli jest dostępny przez cookie lub URL to można uzyskać dostęp do zmiennych przechowywanych na serwerze.
8 Sesja zazwyczaj trwa tak długo jak uruchomiona jest przeglądarka.Jeśli: session.cookie_lifetime = 0 to do czasu restartu przeglądarki. Jeśli dłużej – mechanizm usuwania starych sesji. Są także metody wykorzystania sesji bez cookie – użytkownik może wyłączyć ich obsługę
9 imie=”Jan” Sesja imie=”Jan” Sesja GET/witaj.php?imie=”Jan” SerwerPrzeglądarka imie=”Jan” Sesja SET COOKIE:PHPSESSID=1234 GET/index.php Przeglądarka Serwer COOKIE :PHPSESSID=1234 imie=”Jan” Sesja Witaj Jan ...
10 PHP sprawdza czy id sesji zostało przypisane:automatycznie (jeśli session.auto_start w php.ini jest ustawione na 1) jawnie przez wywołanie session_start() niejawnie przez wywołanie session_register() Jeśli tak, poprzednio zachowane środowisko jest odtwarzane Opcje konfiguracyjne track_vars i register_globals wpływają na to, jak zmienne sesyjne są przechowywane i odtwarzane. Zapisane w pliku php.ini
11 register_globals PHP posiada możliwość ustawienia w pliku konfiguracyjnym php.ini dyrektywy register_globals. Jest ona odpowiedzialna za rejestrowanie danych otrzymanych z formularzy, ciastek, sesji czy serwera jako zmienne globalne. Oznacza to, że jeśli dyrektywa register_globals została ustawiona na on to wszystkie zmienne przekazane do skryptu dostępne są w postaci $nazwa_zmiennej, bez potrzeby stosowania żadnych tablic. Jest to łatwiejsze, lecz powoduje niebezpieczeństwo - używając zmiennych globalnych nie można stwierdzić, czy dana wartość pochodzi z sesji czy może została podana w URL- u metodą GET.
12 Zależnie od metody, zmienne trafiają do odpowiednich tablic asocjacyjnych. Dane przesłane metodą GET trafiają do tablicy $_GET (lub $HTTP_GET_VARS w wersjach starszych niż 4.1.0) a dane z metody POST to tablicy $_POST (lub $HTTP_POST_VARS). Tablice $_GET i $_POST są superglobalne. Oznacza to, że są widoczne w każdym miejscu kodu PHP bez konieczności użycia składni globals. Źle napisane skrypty – możliwość obejścia zabezpieczeń. Używanie odpowiednich tablic jest mocno zalecane. Począwszy od wersji 4.2.0, dyrektywa register_globals jest domyślnie wyłączona. Pisząc skrypt dla nieznanego serwera trzeba się liczyć z ewentualnością braku dostępu do zmiennych globalnych.
13 track_vars Jeśli włączone – zmienne środowiskowe, GET, POST, Cookie, i zmienne serwera można znaleźć w superglobalnych tablicach asocjacyjnych: $_ENV, $_GET, $_POST $_COOKIE $_SERVER $_SESSION
14 Najczęściej używane funkcje:session_start(); //tworzy lub wznawia istniejącą sesję, sprawdza istnienie PHPSESSID lub jeśli wskazany w żądaniu identyfikator nie zostanie znaleziony to tworzona jest nowa sesja session_id(); //Pobiera i/lub ustawia identyfikator bieżącej sesji session_register(zm1,zm2...);// Rejestruje jedną lub więcej zmiennych w bieżącej sesji session_is_registered (zmienna);/bez znaku $ albo w ciapkach ' ' - //sprawdza, czy zmienna jest zarejestrowana w sesji session_ unregister(zmienna); //Wyrejestrowuje zmienną z bieżącej sesji session_unset();//Zwalnia wszystkie zmienne sesyjne session_destroy(); //Niszczy wszystkie dane zarejestrowane w sesji
15 Od wersji PHP 4.1.0 dostępna jest superglobalna tablica$_SESSION
16 Rejestracja zmiennej: session_start(); if (isset($_SESSION['licznik'])) { $_SESSION['licznik']++; } else { $_SESSION['licznik'] = 0; echo $licznik."
"; echo "Bezpieczniej:".$_SESSION['licznik']; //gdy register_globals wyłączone ?>
17 Rejestracja tablicy – plik ses1.phpsession_start(); $x1=array(100,200,300); echo "0-$x1[0]
"; echo "1-$x1[1]
"; echo "2-$x1[2]
"; $_SESSION['tablica'] = $x1; echo "Drugi"; ?> Przechwyt w pliku ses2.php session_start(); echo $_SESSION['tablica'][0]; echo "
"; echo $_SESSION['tablica'][1]; echo $_SESSION['tablica'][2]; ?>
18 Wyrejestrowanie zmiennej: session_start(); unset($_SESSION['licznik']); ?>
19 Jeśli włączona jest opcja register_globals, wszystkie globalne zmienne mogą być zarejestrowane jako zmienne sesyjne a zmienne sesyjne będą odtworzone do odpowiadających im zmiennych globalnych. Ponieważ PHP musi wiedzieć które globalne zmienne są zarejestrowane jako zmienne sesyjne, użytkownik musi użyć funkcji session_register(), podczas gdy tablica $_SESSION nie musi używać session_register(). Zwykle register_globals jest wyłączone
20 Prosty przykład: FORMULARZ: .... Imię:
21 Wynik1.php session_register("Im"); //SESSION_START wykonane niejawnie $Im=$_POST['Imie']; echo "Zmienna:$Im
"; echo "Zmienna sesyjna:".$_SESSION['Im']."
"; ?> lub session_start(); $_SESSION['Im']=$_POST['Imie']; echo "Zmienna sesyjna:".$_SESSION['Im']."
"; echo "Ciastko:".$_COOKIE['PHPSESSID']; ?>
22 Formularz: rejestr1.phpPrzykład: Formularz: rejestr1.php echo " "; echo "
"; echo ""; ?> Nazwisko: Imię: Adres:
23 Plik rejestr2.php echo " "; echo ""; echo "Witaj ".$_POST['T1']."
"; echo "Zapamiętałem twoje dane
"; echo "Nazwisko:".$_POST['T1']."
"; echo "Imie:".$_POST['T2']."
"; echo "Adres:".$_POST['T3']."
"; $PHPSESSID=sess_id(); echo $PHPSESSID."
"; var_dump($_SESSION); ?>
24 Upload plików – wysyłanie na serwerFormularz:
25 Plik dodaj.php chmod('./obrazki',0777); //Powstaje tablica _FILES echo "FILES:".$_FILES['obrazek']["tmp_name"]." Plik dodany
"; if (isset($_FILES['obrazek'])) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["obrazek"]["tmp_name"]; $name = $_FILES["obrazek"]["name"]; if (is_uploaded_file($tmp_name)) move_uploaded_file($tmp_name, './obrazki/'.$name); $komunikat = "
26 //wyświetlenie spisu obrazków w katalogu obrazki$kat = opendir('./obrazki'); //otwarcie do czytania $lista_plikow = ""; //pocz listy
while ($naz_pliku = readdir($kat)) //war. zakończenia if (($naz_pliku !=".")&&($naz_pliku !="..")) //filtr $lista_plikow .= "
27 Można też sprawdzać rozmiar i typ pliku:$allowed_types = array("jpg" , "JPG"); $filename = $_FILES['obrazek']['name']; $filetype = substr($filename, -3, 3); if((!in_array($filetype,$allowed_types))&&($filename!="")) { echo '"; echo "zly typ"; exit; } elseif ($_FILES['obrazek']['size']>$dopusz_rozm) { echo '