Jak nedělat bezpečnost
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.
27.5.2011 14:54:04
Emil:
Myslím, že máte pravdu.
27.5.2011 14:56:25
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)>.
27.5.2011 15:05:59
Jde o to, že zmíněná funkce z řetězce to <x:x> vyhodí, takže zbude jen <b onmouseover=alert(1)>.
27.5.2011 15:06:57
Jan:
Ups, toho jsem si nevšiml. Díky za nakopnutí, mimochodem to je dost otřesná chyba.
27.5.2011 15:13:54
Emil:
Co vlastně tato definice (<x:x>) v XHTML znamená?
27.5.2011 15:14:35
Značka „x“ ze jmenného prostoru „x“ určeného atributem xmlns:x="".
27.5.2011 15:15:34
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).
27.5.2011 15:30:36
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/purifier29.5.2011 19:06:41
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.
30.5.2011 15:59:21
Dobrý úlovek. Nedávno někdo narazil na
http://shiflett.org/x – web postavený nad Lithium.
30.5.2011 16:15:35
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.
1.6.2011 13:08:04