Na navigaci | Klávesové zkratky

Hackeři vám zaútočí na web

Co chvíli je hlášena bezpečnostní díra na dalším významném webu (Alza, Mapy.cz, BontonLand). Nebo je díry zneužito. Zkuste si vyhledat slova XSS zranitelnost a pochopíte, proč je Cross Site Scripting (XSS) dnes jednou z nejrozšířenějších a nejnebezpečnějších děr.

Záležitost nepříjemná pro provozovatele webů a snad ještě víc pro dodavatele. Může poškodit jméno, může dojít na pokuty, žaloby, nebo jen pokazí vztah s klientem. Jak se proti XSS bránit? Tzv. escapováním řetězců. Bohužel naprostá většina odborníků v tom plave. (Nechci být netaktní a někoho se dotknout, snad jen řeknu, že z „československých IT celebrit“ znám asi jen jednoho člověka, který se ve věci do hloubky vyzná.) Tudíž i články o této problematice na známých webech jsou, řekněme, nepřesné.

Navíc ono escapování se obvykle provádí v šabloně, padá tak na bedra kodéra. Tedy nejkritičtější místo vyžadující vysokou erudici řeší člověk nepovolaný. Jak taková věc může dopadnout? To přece víme – viz první odstavec.

Spasí vás Nette Framework

Rád bych vám představil jednu killer feature šablonovacího systému Latte v Nette Framework. Vlastnost tak zásadní, že sama o sobě je důvodem framework zvolit. Nebo klidně z něj použít jen šablony.

  • čím jste větší firma, tím je pro vás vlastnost důležitější
  • žádný konkurenční framework ji dodnes nemá 1)

Nette Framework v šablonách escapuje automaticky. Jeho vlastnost Context-aware escaping rozezná, ve které části dokumentu se nacházíte a podle toho zvolí správné escapování.

Teď zabrousím do techničtější roviny. Jak to funguje, nejlépe uvidíte na příkladu. Mějme proměnnou $var a tuto šablonu:

<p onclick="alert({$var})">{$var}</p>

<script>
document.title = {$var};
</script>

Zápis {$var} znamená vypsání proměnné. Jenže každé vypsání je nutné ještě explicitně ošetřit, dokonce na každém místě jinak. Kodér musí (například ve Smarty) připsat příslušné modifikátory, nesmí se přitom splést a hlavně nic opomenout.

V Nette Framework není potřeba nic ošetřovat. Vše se udělá automaticky, správně a důsledně!

Pokud dosadíme do proměnné $var = 'Šířka 1/2"', framework vygeneruje HTML kód:

<p onclick="alert(&quot;Šířka 1\/2\&quot;&quot;)">Šířka 1/2&quot;</p>

<script>
document.title = "Šířka 1\/2\"";
</script>

Samozřejmě je myšleno i na situaci, když je potřeba vypsat proměnnou bez ošetření, například proto, že obsahuje text článku včetně HTML značek. V takovém případě se použije zápis {$var|noescape}.

Konec technické odbočky. Díky Latte najednou platí, že

  • podoba šablony zůstala jednoduchá
  • vy se nemusíte bát, že kodér někde něco opomene
  • a zároveň v něm nepotřebujete mít top odborníka na escapování ;)
  • práce jde mnohem snáze

Další informace o chytrých šablonách Latte najdete v dokumentaci.


1) asi půl roku po Nette přišel s podobnou vlastností Google pro svoji knihovnu v C++, žádný framework v PHP, Ruby nebo Pythonu nic podobného, pokud vím, dosud nemá

Komentáře

  1. Filosof #1

    avatar

    >> Now zabrousím to technical levels.

    Google ti úplně nezvládá překlady, které nejsou správně česky ?

    před 15 lety
  2. Jakub #2

    avatar

    V případě googlu myslíš ctemplate?

    před 15 lety | reagoval [6] David Grudl
  3. Aleš Roubíček #3

    avatar

    Ahoj, šablonovací systém Spark (pro ASP.NET MVC a Monorail) tohle má. V dokumentaci to ještě neni aktualizováno (ačkoli je to featura několik měsíců stará). Ale výraz ${variable} je automaticky escapován. Nejsem si jistý, zda funguje sensitivně na kontext, kde zrovna je…

    před 15 lety | reagoval [6] David Grudl
  4. vlko #4

    avatar

    Problem s escapovanim je v pripade ak chceme aby uzivatel zadaval html text, v php to je jednoduche staci pouzit nejaku existujucu kniznicu ako napr:
    https://sourceforge.net/projects/kses/

    Ale pokial ide o zdroje k problematike, tak zopar light informacii pre asp.net k problematike xss je mozne najst napr tu:
    https://web.archive.org/…-100533.aspx
    #stary-odkaz-#stary-odkaz-http://www.aspnet.sk/Ako-sa-branit-XSS-v-Asp.Net-100152.aspx
    a v pripadne alternativa ku kses
    https://web.archive.org/…-100481.aspx

    BTW: Dufam, ze tychto prispevkov tu nebude moc, pretoze z ff3.5 sa mi komentar pridat nepodarilo:(

    před 15 lety | reagoval [6] David Grudl
  5. Augi #5

    avatar

    IMHO je třeba, aby reagoval na kontext, protože encodování znaků je jiné v hodnotách atributů a jiné v textu…

    před 15 lety
  6. David Grudl #6

    avatar

    #2 Jakube, jj, tak se to jmenuje

    #3 Aleši Roubíčku, právě ta kontextová citlivost je na tom nejdůležitější. Můžeš to nějak vyzkoušet, jestli to umí?

    #4 vlko, ano. V PHP lze takto použít třeba Texy, pravda je, že tato jeho stránka není příliš známá.

  7. Aleš Roubíček #7

    avatar

    #6 Davide Grudle, Texy používám jako XSS filter velmi rád :)

    před 15 lety
  8. Jakub Vrána #8

    avatar

    z „československých IT celebrit“ znám asi jen jednoho člověka, který se ve věci do hloubky vyzná

    Díky, že sis na mě vzpomněl ?. A teď jsem za nafounkánka já… Tedy pokud jsi nemyslel sebe!

    před 15 lety | reagoval [11] Roman
  9. Aleš Roubíček #9

    avatar

    #6 Davide Grudle, Vypadá to na kotextovou necitlivost, navrhnu to jako možnost vylepšení;

    před 15 lety
  10. vlko #10

    avatar

    #6 Davide Grudle, teda neviem ako presne funguje texy, ale kses odstrani z existujuceho html kodu, nepovolene znaky a atributy (na vstupe sa definuje zoznam povolenych tagov a ich atributov, ak nie je ziaden odstrani vsetky html tagy).

    před 15 lety
  11. Roman #11

    avatar

    #8 Jakube Vráno, Alebo myslel Synopsiho (ehmo) ?

    před 15 lety
  12. mila #12

    žádný framework v PHP, Ruby nebo Pythonu nic podobného, pokud vím, dosud nemá

    http://docs.djangoproject.com/…s/templates/#id2 (od listopadu 07)

    před 15 lety | reagoval [13] David Grudl
  13. David Grudl #13

    avatar

    #12 milo, žádný náznak kontextově sensitivního escapování tam nevidím (červenec 09)

    před 15 lety | reagoval [14] mila
  14. mila #14

    #13 Davide Grudle, myšleno, že je escapovaní je automatické

    před 15 lety
  15. Wii #15

    avatar

    Velice se mi osvědčil jednoduchý skriptík který prochází celé pole $_POST a $_GET a likviduje veškerý html kód. Nemusím se později starat o data co mi jdou od uživatele.
    Co říkáte na tohle řešení ? Ano vím měl bych spíš řešit v šabloně, ale teoreticky i prakticky se nemá jak dostat škodlivý kód do DB, kromě toho že by se tam vložil skrze DB a to už je stejně pozdě ?

    před 15 lety | reagoval [16] David Grudl
  16. David Grudl #16

    avatar

    #15 Wii, To není dobré řešení – protože provádíš výstupní filtrování na vstupních datech. V takové aplikaci pak není možné mít třeba editor HTML článků, protože už vstupní filtr je poškodí. Poškodí i vše, co jen jako HTML vypadá, ale není (např hypotetický nick John <Wii> Doe). Naopak nechá proklouznout kontrolní znaky a nevalidní UTF-8 řetězce.

    před 15 lety | reagoval [17] Wii
  17. Wii #17

    avatar

    #16 Davide Grudle, toho jsem si vědom, že nepropustí žádný html editor a proto jsou v cfg aplikaci nastavený názvy prvků, který nemá kontrolovat.
    Špatně jsem se vyjádřil, nelikviduje html kód ale tvoří entity, takže bude výsledek John &lt;Wii&gt; Doe , což se zobrazí korektně.
    „kontrolní znaky a nevalidní UTF-8 řetězce“ co si prosím pod tím mám představit ?

    před 15 lety | reagoval [18] David Grudl
  18. David Grudl #18

    avatar

    #17 Wii, tvoření entit je stejný problém – filtr, který má fungovat na výstupu, aplikuješ na vstup. S takovým řetězcem už nemůžeš nic dělat, nelze ho například oříznout na potřebnou délku apod.

    před 15 lety
  19. Prťka #19

    Jak to vypadá s tím článkem o nových šablonách?

    před 15 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.