1 / 27

Wykład 7

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 (PHP 3, PHP 4 , PHP 5)

irina
Download Presentation

Wykład 7

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Teleinformatyka Wykład 7 Komunikacja klient-serwer – cd.

  2. 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

  3. 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. CIASTECZKA „cookies”

  4. 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ę wsteczsetcookie ("TestCookie", "", time() - 3600); Przykład 3. Sprawdzenie ciasteczkaif (isset($_COOKIE["TestCookie"])) kod1; else kod2;

  5. <?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 ?> Licznik odwiedzin (czuły na odświeżanie strony)

  6. SESJA Unikalnyidentyfikatorgenerowany przez PHP, przechowywany po stronie klienta: • zwyklejest 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: 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.

  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. 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>

  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: <?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 ?>

  17. Rejestracja tablicy – plik ses1.php • <?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 "<BR>"; • 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: .... <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>

  21. 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']; ?>

  22. 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>"; ?>

  23. 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); ?>

  24. 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>

  25. 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; } } }

  26. //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"; ?>

  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 '<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 "</SCRIPT>"; echo "za duzy"; exit; } Są biblioteczne procedury zmiany wymiarów obrazów

More Related