Nikdy neodesílejte do streamu HTML žádné bity dat, které nebyly předány přes htmlspecialchars()
a máte hotovo. Jednoduché pravidlo, které se snadno dodržuje, zcela eliminuje jakékoli riziko XSS.
Jako programátor je to vaše práce to udělat.
Můžete definovat
function h(s) { return htmlspecialchars(s); }
if htmlspecialchars()
je příliš dlouhý na to, aby zapsal 100krát do souboru PHP. Na druhou stranu pomocí htmlentities()
není vůbec nutné.
Klíčovým bodem je:Existuje kód a jsou zde data. Pokud obojí smícháte, dojde ke špatným věcem.
V případě HTML jsou kódem prvky, názvy atributů, entity, komentáře. Data jsou všechno ostatní. Data musí být escapován, aby nedošlo k záměně za kód.
V případě adres URL je kód schéma, název hostitele, cesta, mechanismus řetězce dotazu (?
, &
, =
, #
). Data jsou vše v řetězci dotazu:názvy parametrů a hodnoty. Musí být escapován, aby nedošlo k záměně za kód.
Adresy URL vložené do HTML musí být dvakrát escapován (escapováním adresy URL a HTML-escaping), aby bylo zajištěno správné oddělení kódu a dat.
Moderní prohlížeče jsou schopny analyzovat úžasně rozbité a nesprávné označení do něčeho užitečného. Tato schopnost by však neměla být zdůrazňována. Skutečnost, že něco funguje (například adresy URL v <a href>
bez použití správného kódování HTML) neznamená, že je dobré nebo správné to udělat. XSS je problém, který má kořeny v a) lidech, kteří si neuvědomují oddělení dat/kódu (tj. „únik“) nebo v těch, kteří jsou nedbalí, a b) v lidech, kteří se snaží být chytří ohledně toho, která část dat nepotřebují uniknout.
XSS je dost snadné se vyhnout, pokud se ujistíte, že nespadáte do kategorií a) a b).