Menu

Cookie-uri in PHP

Despre cookie detalii tehnice si neinteresante putem spune ca sunt niste fisiere salvate pe calculatorul vizitatorului, dar asta nu intereseaza pe nimeni asa ca trecem la ce este cu adevarat important de stiut.
Cand setezi un cookie vizitatorului e ca si cum ai salva o variabila. In cookie nu se salveaza date importante ale site-ului deoarece ele pot editate de vizitator si cei mai rau furate de un atacator in caz ca siteul vostru este vurnerabil la XSS. (despre care vom vorbii lectia viitoare) In cookie se salveaza date de genul:

Un cookie se salveaza folosind functia
setcookie(string $nume [, string $valoare [, int $expire = 0 [, string $path [, string $domeniu [, bool $secure = false [, bool $httponly = false ]]]]]]);
Unde vedeti parametrii intre paranteze patrate ( [ si ] ) inseamna ca sunt parametrii optionali. In caz ca expire este 0 atunci cookieul se va salva pana este inchis browserul. Daca setam httponly(ultimul parametru) pe true atunci cookieul nu va putea fi folosit de JavaScript deci nu mai exista posibilitatea de a fura cookieul cu ajutorul unui XSS. Un exemplu in care salvam un cookie cu numele exemplu si valoarea Acesta este un exemplu pentru o ora:

<?php 
// time() returneaza numarul secunde trecute de la January 1 1970 00:00:00 GMT numita Epoca Unix
// 3600 secunde inseamna o ora
setcookie('exemplu','Acesta este un exemplu', time()+3600 );
?>
Acum timp de ora putem folosii acest cookie pe oricare pagina din site-ul nostru. Valoarea unui cookie o aflam asemanator $_GET, un exemplu:
<?php  
# Nu uitati sa filtrati cookieurile deoarce ele pot fi editate de utilizator
echo 'Valoarea cookieului <b>exemplu</b> este '.htmlspecialchars($_COOKIE['exemplu']);
?>

Daca dorim sa setam un cookie doar pentru un folder de exemplu forum folosim si argument path , uite asa:

<?php  
setcookie('exemplu','Acesta este un exemplu', time()+3600, '/forum/' );
?>
Acum cookieul a fost setat doar pentru folderul forum si subfolderele lui. Chiar si cookieurile pot fi setate sub forma de array. Exemplu.
<?php 
setcookie('tutorial[ora]','5:41', time()+3600);
setcookie('tutorial[anul]','2013', time()+3600);
// in caz ca $_COOKIE['tutorial'] nu-i setat dam refresh la pagina pentru a se actualiza
if(!isset($_COOKIE['tutorial'])) header('Location: ?'); 

echo htmlspecialchars($_COOKIE['tutorial']['ora']);
?>
Output:

Daca dorim sa stergem un cookie avem doua variante:

  1. Il setam cu valoarea null, si de fiecare data cand verificam daca exista verificam si daca este diferit de null
  2. Ii setam expirarea cu timp in urma, de exemplu o ora
Eu prefer a doua varianta, uitati un exemplu pentru a doua varianta:
<?php 
# Observati ca acum nu mai adaugam la time ci scadem din el
setcookie('exemplu','Acesta este un exemplu', time()-3600 );
?>

Trebuie sa avem grija la eroarea header already sent Cand avem eroarea aceea pur si simplu adaugam prima linie de cod php:

ob_start();
si ultima linie de cod php
ob_end_flush();

De mentionat este ca putem verifica daca vizitatorul a schimbat cookieul cu ajutorul unui hash, dar nu este nevoie sa ne complicam atat timp cat il putem filtra. Insa, este bine de stiut in caz ca o sa aveti nevoie de un cookie ce in caz ca este editat sa stiti:

<?php
ob_start();
$sep = '--sss--';
$secret_key = 'a*s0d0p7%iw3qj&1e(kk';
if(!isset($_COOKIE['securizat'])):
	$valoare = 'Acesta este un cookie securizat contra editarii.';
	$hash = md5(sha1(md5($valoare.$secret_key).$valoare).$secret_key);
	setcookie('securizat',$valoare.$sep.$hash);
	header('Location: ?');
else:
	$cookie = htmlspecialchars($_COOKIE['securizat']);
	$bucati = @explode($sep, $cookie);
	if(@$bucati[1] == md5(sha1(md5($bucati[0].$secret_key).$bucati[0]).$secret_key)){
		echo 'Felicitari, cookie-ul nu a fost modificat!';
	} else{
		echo '<h1 style="color:red;">Nu ai voie sa modifici un cookie!</h1>';
	}
	echo '<pre>'.print_r($bucati, true).'</pre>';
endif;
ob_end_flush();
?>
Output:

Iar in caz ca incerc sa schimb cuvantul cookie in cokie avem ca Output:

Cum functioneaza acest mic trick? Ei bine el consta ca fiecare valoare are un hash specific, ca un cookie sa fie valid el trebuie sa contina atat hash-ul cat si valoarea. Ca un atacator sa reuseasca sa modifice cookieul si sa fie si valid el trebuie sa cunoasca atat secret_key-ul(care dupa cum vedeti este imposibil de ghicit) cat si modul de criptare iar dupa cum vedeti modul de criptare folosit este imposibil de ghicit.



Ti-a placut articolul? Asigura-te ca-ti dam de veste cand publicam altele noi.


Tags: Curs Php

Comments Nota 0 din 0