C, PHP, VB, .NET

Дневникът на Филип Петров


* Cookies – цел и приложение

Публикувано на 18 ноември 2008 в раздел ОСУП.

Дотук в статиите на няколко пъти показвахме как се стартират потребителски сесии и как се записват данни в тях. При тези приложения данните се записваха само на сървъра. Когато потребителя затвори своя браузър цялата сесия се унищожаваше, а на компютъра на потребителя не се пазеше никаква информация. Когато става въпрос за автентикация - това е сигурният и правилен начин за управление на сесия!

Често в редица приложения като форуми, блогове, електронни пощи и т.н. сте виждали реализирана функционалност от вида "запомни моята парола", т.е. сървъра "запомня" вашият компютър и не ви кара да въвеждате парола когато влизате в сайта, а автоматично ви разпознава. Широко употребявана техника за постигане на това е т.нар. cookie - парче информация, което сървъра съхранява в кеша на вашия браузър.

Всяко cookie, използвано за автентикация, само по себе си е сериозен потенциален пробив в сигурността на вашата система! Обикновено ако някоя трета страна успее да се сдобие с cookie на ваш потребител, то може да се приеме, че той има достъп до вашата система. Понеже cookie се складира на клиентската машина, то вашето приложение няма никакъв контрол над сигурността му и неговата защита. Поради тази причина бихме дали препоръка - не използвайте cookies за автентикация при приложения, в които сигурността е от особено значение! Тяхната употреба като "автентикатор" трябва да е позволена само и единствено, когато приложението ви не съхранява критично важна информация (номера на кредитни карти, банкови сметки, конфиденциална информация и др.). Това, че пробива в сигурността не е във вашето приложение и не е на вашия сървър, не би трябвало да ви снема от отговорност като програмисти на дадената система!

Все пак - какво е cookie и как да реализирам "запомни моята парола" в моето приложение? Cookie са малки текстови файлове (максимален размер от 4KB). Записват се във временната директория на браузъра (напр. "Temporary Internet Files" при Internet Explorer). Сървърът има достъп както да чете, така и да записва cookie, освен когато това е изрично забранено в браузъра на потребителя. Всяко cookie съдържа комбинацията от "ключ" и "стойност". Като допълнителна информация в него се записва домейн, който може да има достъп до него (т.е. чужди уеб сайтове нямат достъп до вашето cookie!) и дата на валидност.

Когато става въпрос за запис на обикновена, никому не вредяща информация, то cookies са изключително полезни. Нека например разгледаме cookie, което запомня първото ви име. Чрез него сайта все едно е "запомнил" вашето име, без да го е записвал в база данни или на друго място на сървъра.

<?php
	// Ако cookie е вече създадено, то го използваме
	if (isset($_COOKIE['fname']) && is_string($_COOKIE['fname'])){
		echo '<html><head><title>WorldBank.dom cookie page</title></head><body>';
		echo "Welcome back ".$_COOKIE['fname'];
	}
	else{
		// В противен случай ще създадем форма
		// която взима името на човека и я изпраща
		// към същия файл. Със следното условие
		// проверяваме дали формата е изпълнена или не
		if( isset($_POST['submit']) && isset($_POST['fname']) && is_string($_POST['fname'])){
			// Записваме cookie с ключ fname,
			// стойност името, което сме въвели във формата
			// и време на активност един час
			setcookie("fname",$_POST['fname'], time()+3600);
			echo '<html><head><title>WorldBank.dom cookie page</title></head><body>';
			echo "Hello ".$_POST['fname'];
		}
		else{
			// Отпечатваме самата форма
			echo '<html><head><title>WorldBank.dom cookie page</title></head><body>';
			echo 'enter first name:';
			echo '<form action="cookie.php" method="POST">';
			echo '<input type="text" name="fname">';
			echo '<input type="submit" name="submit"';
		}
	}
?>
</body></html>

Имайте предвид, че ако не въведете време на активност, то cookie ще "живее" само в текущата сесия на браузъра, тоест ще бъде абсолютно безполезно тъй като е напълно заменимо с доста по-сигурните сървърни сесии. Както виждате в PHP можете да четете cookie през супер-глобаната променлива $_COOKIE. Функцията setcookie се използва за създаването му.

Ако искате да изтриете cookie, то просто го създайте със същото име и задна дата:

	setcookie("fname", "", time()-3600);

Това всъщност е естественият, но неправилен начин. Проблем има, когато часовникът на сървъра е компрометиран. Затова използвайте функцията mktime:

	// Правилен начин за изтриване на cookie
	setcookie("UsersName", "", mktime(12,0,0,1, 1, 1970));

В представения вид cookie са изключително удобни при множество услуги, като например запазване на реда на подреждане на писмата във вашия webmail, настройки за външният вид на вашия форум (например id на използвана тема), настройки на търсачката която използвате, и др. В такива случаи е по-удобно да използвате cookie, вместо да пълните базата от данни на сървъра с ненужно количество информация. Когато става въпрос за запазване на конфиденциална информация, като например име и парола, нещата стават съвсем различни. В по-следващите статии ще разгледаме теми свързани със сигурността на cookie, когато те се използват за автентикация.

ВАЖНО: В показания по-горе код има възможен пробив в сигурността от тип XSS (Cross Site Scripting). Това се случва на реда, където отпечатваме съдържанието на cookie (тоест информация придобита от потребителя) на екрана. Ще разгледаме по-подробно този род атаки в по-следващи статии.

 



Добави коментар

Адресът на електронната поща няма да се публикува


*