Teleinformatyka Wykład 7 Komunikacja klient-serwer – cd.
Metody: pliki – niewygodne, czasochłonne ciasteczka "cookie" – na komputerze klienta bazy danych na serwerze - trwałe mechanizm sesji – dane nietrwałe, np. do czasu otwarcia przeglądarki
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 <html> czy <head>. 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 4.1.0 była to tablica $HTTP_COOKIE_VARS.
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() - 3600); Przykład 3. Sprawdzenie ciasteczka if (isset($_COOKIE["TestCookie"])) kod1; else kod2;
Licznik odwiedzin (czuły na odświeżanie strony) <?php 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<BR>"; echo"<BR>"; var_dump($_COOKIE);//informacja o tablicy _COOKIE ?>
zwykle jest zapisany w cookie przekazywany przez URL-e SESJA 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
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: db2245f91a5a3dadd2010ba0172b0290 - 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.
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ę
imie=”Jan” Sesja imie=”Jan” Sesja GET/witaj.php?imie=”Jan” Serwer Przeglądarka imie=”Jan” Sesja SET COOKIE:PHPSESSID=1234 GET/index.php Przeglądarka Serwer COOKIE :PHPSESSID=1234 imie=”Jan” Sesja <HTML> Witaj Jan ...<HTML>
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
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.
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.
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
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
Od wersji PHP 4.1.0 dostępna jest superglobalna tablica $_SESSION
Rejestracja zmiennej: <?php session_start(); if (isset($_SESSION['licznik'])) { $_SESSION['licznik']++; } else { $_SESSION['licznik'] = 0; echo $licznik."<BR>"; echo "Bezpieczniej:".$_SESSION['licznik']; //gdy register_globals wyłączone ?>
Rejestracja tablicy – plik ses1.php session_start(); $x1=array(100,200,300); echo "0-$x1[0]<BR>"; echo "1-$x1[1]<BR>"; echo "2-$x1[2]<BR>"; $_SESSION['tablica'] = $x1; echo "<A href=\"ses2.php\">Drugi</A>"; ?> Przechwyt w pliku ses2.php <?php session_start(); echo $_SESSION['tablica'][0]; echo "<BR>"; echo $_SESSION['tablica'][1]; echo $_SESSION['tablica'][2]; ?>
Wyrejestrowanie zmiennej: <? session_start(); unset($_SESSION['licznik']); ?>
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
Prosty przykład: FORMULARZ: .... <meta http-equiv=\"Content-Language\" content=\"pl\"> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1250\"> </HEAD><BODY> <FONT SIZE=5 color=\"red\"> <FORM method="POST" action="wynik1.php"> <p>Imię:<input type="text" name="Imie" size="20" > <input type="Submit" value="Wykonaj" name="B2"></p> </FORM>
Wynik1.php <?php session_register("Im"); //SESSION_START wykonane niejawnie $Im=$_POST['Imie']; echo "Zmienna:$Im<BR>"; echo "Zmienna sesyjna:".$_SESSION['Im']."<BR>"; ?> lub <?php session_start(); $_SESSION['Im']=$_POST['Imie']; echo "Zmienna sesyjna:".$_SESSION['Im']."<BR>"; echo "Ciastko:".$_COOKIE['PHPSESSID']; ?>
Formularz: rejestr1.php Przykład: Formularz: rejestr1.php <?php echo " <meta http-equiv=\"Content-Language\" content=\"pl\"> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1250\">"; echo "<form method=\"POST\" action=\"rejestr2.php\"> <table width=100%> <tr> <td width=8%>Nazwisko:</td> <td width=82%><input type=\"text\" name=\"T1\" size=20></td> </tr> <tr> <td width=8%>Imię:</td> <td width=82%><input type=\"text\" name=\"T2\" size=20></td> </tr> <tr> <td width=8%>Adres: </td> <td width=82%><input type=\"text\" name=\"T3\" size=20></td> </tr> </table> <p><input type=\"submit\" value=\"Akceptuj\" name=\"B1\"></p>"; echo "</form>"; ?>
Plik rejestr2.php <?php session_start(); echo "<meta http-equiv=\"Content-Language\" content=\"pl\"> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1250\">"; echo "<FONT size=4>"; echo "Witaj ".$_POST['T1']."<BR>"; echo "Zapamiętałem twoje dane<BR>"; echo "Nazwisko:".$_POST['T1']."<BR>"; echo "Imie:".$_POST['T2']."<BR>"; echo "Adres:".$_POST['T3']."<BR>"; $PHPSESSID=sess_id(); echo $PHPSESSID."<BR>"; var_dump($_SESSION); ?>
Upload plików – wysyłanie na serwer Formularz: <form action="dodaj.php" method="post" enctype="multipart/form-data"> <input type="file" name="obrazek" /> <input type="submit" value="Wyslij" /> </form>
Plik dodaj.php <?php chmod('./obrazki',0777); //Powstaje tablica _FILES echo "FILES:".$_FILES['obrazek']["tmp_name"]."<BR>"; 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 = "<p class='komunikat'>Plik dodany</p>"; echo $komunikat; }
//wyświetlenie spisu obrazków w katalogu obrazki $kat = opendir('./obrazki'); //otwarcie do czytania $lista_plikow = "<ul>"; //pocz listy while ($naz_pliku = readdir($kat)) //war. zakończenia if (($naz_pliku !=".")&&($naz_pliku !="..")) //filtr $lista_plikow .= "<li>$naz_pliku"; //dopisanie $lista_plikow .= "</ul>"; //koniec listy closedir($kat); echo "$lista_plikow"; ?>
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 '<SCRIPT language="javascript">'; echo "alert('Typ obrazka musi być JPG ')"; echo "</SCRIPT>"; echo "zly typ"; exit; } elseif ($_FILES['obrazek']['size']>$dopusz_rozm) { echo '<SCRIPT language="javascript">'; echo "alert('Rozmiar obrazka max 100 kb')"; echo "za duzy"; exit; Są biblioteczne procedury zmiany wymiarów obrazów