Jak nedělat bezpečnost
Školení, která pořádám
Narazil jsem na funkci Kohana_Security::xss_clean. Je to opravdu lahůdková ukázka toho, jak se nepokoušet o bezpečnost. Co mi na funkci vadí?
- Navzdory svému názvu kód proti XSS neochrání – stačí zadat fragment jako
<b on<x:x>mouseover=alert(1)>
. Sami byste jistě našli desítky dalších případů.
- Mrší uživatelský vstup – znehodnotí například neškodný příspěvek typu: Kliknutí myši můžete obsloužit pomocí atributu onclick="".
- V uživatelích vyvolává falešný pocit bezpečnosti.
Jsem opravdu rád, že z aktuální verze už tato hrůza zmizela. Nicméně řada 3.0 je stále podporovaná a patří mezi stabilní. Pokud ji tedy používáte, tak se této funkci obloukem vyhněte.
Jak ošetřit uživatelský vstup správně?
- Se vstupem pracovat jako s běžným textem a ošetřit ho funkcí htmlspecialchars.
- Vstup uživatele převést do HTML pomocí specializovaného převaděče, např. Texy.
- Při použití WYSIWYG editoru použít filtrování podle white-listu, např. HTML Purifier.
Přijďte si o tomto tématu popovídat na školení Bezpečnost PHP aplikací.
Diskuse
Stane se :-). Nahlásil jsem to Martinu Malému a doufám, že mi nedá ban.
Emil:
Myslím, že máte pravdu.
Jan:
Ad 1) Můžete Jakube prosím uvést případ, kdy se takový fragment správně vyhodnotí a v prohlížeči spustí? Uvnitř tagu není další tag povolen a končí tak jeho definice. Takže se to rozpadá na <b on><x:x> a textový mouseover=alert(1)>.
Jde o to, že zmíněná funkce z řetězce to <x:x> vyhodí, takže zbude jen <b onmouseover=alert(1)>.
Jan:
Ups, toho jsem si nevšiml. Díky za nakopnutí, mimochodem to je dost otřesná chyba.
Emil:
Co vlastně tato definice (<x:x>) v XHTML znamená?
Značka „x“ ze jmenného prostoru „x“ určeného atributem xmlns:x="".
v6ak:
Dobrý (anti)příklad. Ke kritice bych dodal ještě jeden bod, byť to možná vyzní trošku filozoficky:
* Matoucí název třídy. Podobně, jako někteří chtějí 'zapnout SEO', tak tato třída se tváří, jako by 'zapínala bezpečnost'. (Trošku podobně jako některé antiviry.) Já bych tu třídu rozdělil do příslušných částí (tedy např. Kohana_Html a Kohana_Forms nebo Kohana_Http_Csrf nebo nějak tak).
Jirka:
Já tu metodu v Kohaně používám, ale vlastní čištění má na starosti HTMLPurifier. S původním xss_clean to má tedy společné jen název. Kohana modul pro htmlpurifier je tu
https://github.com/shadowhand/purifier
pajousek:
Kohana se s tím zabezpečením obecně nějak neštve. :)
http://kohanaframework.org/trololol -- todle by se veřejně ukazovat imho nemělo, ne? A nebo to možná bude tím, že Kohana nezvládá ani různé controllery/actions pro Errory, musí se to nechutně obcházet.
Mirek:
Na
http://kohanaframework.org je to videt umyslne, nemuzu ted najit prislusny vlakno, kde se o tom diskutuje, ani nerikam, ze je to spravne.
Diskuse je zrušena z důvodu spamu.