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í?

  1. 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ů.
  2. Mrší uživatelský vstup – znehodnotí například neškodný příspěvek typu: Kliknutí myši můžete obsloužit pomocí atributu onclick="".
  3. 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ě?

Přijďte si o tomto tématu popovídat na školení Bezpečnost PHP aplikací.

Jakub Vrána, Dobře míněné rady, 27.5.2011, on-line

Diskuse

Jur4:

Ten zápis nepobraly ani weblogy. Všechno co je za tím je tučně. :)

http://img820.imageshack.us/img820/9539/weblogy.png
27.5.2011 14:52:13

ikona Jakub Vrána:

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

ikona Jakub Vrána:

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

ikona Jakub Vrána:

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/purifier
29.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

ikona Jakub Vrána:

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

Jirka:

http://forum.kohanaframework.org/discussion/….org-site-/p1

Pajousek - nevím co myslíš tím obcházením? Normálně se udělá error controller a tomu se předává zachycená kohana_exception ?
3.6.2011 11:05:23

Michal:

To není bug, ale úmysl:
http://dev.kohanaframework.org/issues/3302
5.7.2011 18:24:52
avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.