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

  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í (13.3.2018, Praha).

Jakub Vrána, Dobře míněné rady, 27.5.2011, diskuse: 15 (nové: 0)

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

ikona Jakub Vrána OpenID:

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

ikona Jakub Vrána OpenID:

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

ikona Jakub Vrána OpenID:

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.

ikona Jakub Vrána OpenID:

Dobrý úlovek. Nedávno někdo narazil na http://shiflett.org/x – web postavený nad Lithium.

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.

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 ?

Michal:

To není bug, ale úmysl:
http://dev.kohanaframework.org/issues/3302

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 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.