Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Translate to English… Ins Deutsche übersetzen…

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řeci víme – viz první odstavec.

Spasí vás Nette Framework

Rád bych vám představil jednu killer feature šablonovacího systému 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}, kde vykřičník srozumitelně funguje jako výstražné znaménko.

Konec technické odbočky. Díky Nette Framework 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 najdete třeba na Zdrojáku nebo v návodu, kterak je lze používat samostatně.


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 RSS 2.0 komentářů » přidat

avatar

#1 Filosof http://blog.filosof.biz/ nový

>> Now zabrousím to technical levels.

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

Posláno 2. 7. 2009 v 16.00 | Odpovědět
avatar

#2 Jakub jfojtl@gmail.com nový

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

Posláno 2. 7. 2009 v 16.05 | Odpovědět
Na komentář reagoval [6] David Grudl
avatar

#3 Aleš Roubíček http://rarous.net/ nový

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…

Posláno 2. 7. 2009 v 16.12 | Odpovědět
Na komentář reagoval [6] David Grudl
avatar

#4 vlko http://vlko.zilina.net nový

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:
http://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:
http://www.aspnet.sk/…-100533.aspx
http://www.aspnet.sk/…-100152.aspx
a v pripadne alternativa ku kses
http://www.aspnet.sk/…-100481.aspx

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

Posláno 2. 7. 2009 v 16.13 | Odpovědět
Na komentář reagoval [6] David Grudl
avatar

#5 Augi http://www.augi.cz nový

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

Posláno 2. 7. 2009 v 16.15 | Odpovědět
avatar

#6 David Grudl http://davidgrudl.com nový

#2 Jakub: jj, tak se to jmenuje

#3 Aleš Roubíček: 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á.

Posláno 2. 7. 2009 v 16.20 | Odpovědět
avatar

#7 Aleš Roubíček http://rarous.net/ nový

#6 David Grudl: Texy používám jako XSS filter velmi rád :)

Posláno 2. 7. 2009 v 16.24 | Odpovědět
avatar

#8 Jakub Vrána http://php.vrana.cz/ nový

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!

Posláno 2. 7. 2009 v 16.37 | Odpovědět
Na komentář reagoval [11] Roman
avatar

#9 Aleš Roubíček http://rarous.net/ nový

#6 David Grudl: Vypadá to na kotextovou necitlivost, navrhnu to jako možnost vylepšení;

Posláno 2. 7. 2009 v 17.02 | Odpovědět
avatar

#10 vlko http://vlko.zilina.net nový

#6 David Grudl: 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).

Posláno 2. 7. 2009 ve 20.48 | Odpovědět
avatar

#11 Roman http://www.c64.sk nový

#8 Jakub Vrána: Alebo myslel Synopsiho (ehmo) ;-)

Posláno 4. 7. 2009 v 0.47 | Odpovědět

#12 mila nový

žá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)

Posláno 7. 7. 2009 v 18.09 | Odpovědět
Na komentář reagoval [13] David Grudl
avatar

#13 David Grudl http://davidgrudl.com nový

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

Posláno 7. 7. 2009 v 18.51 | Odpovědět
Na komentář reagoval [14] mila

#14 mila nový

#13 David Grudl: myšleno, že je escapovaní je automatické

Posláno 8. 7. 2009 v 15.56 | Odpovědět
avatar

#15 Wii d@kabel1.cz nový

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ě :-)

Posláno 9. 7. 2009 ve 2.54 | Odpovědět
Na komentář reagoval [16] David Grudl
avatar

#16 David Grudl http://davidgrudl.com nový

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

Posláno 9. 7. 2009 v 9.22 | Odpovědět
Na komentář reagoval [17] Wii
avatar

#17 Wii d@kabel1.cz nový

#16 David Grudl: 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 ?

Posláno 9. 7. 2009 v 18.21 | Odpovědět
Na komentář reagoval [18] David Grudl
avatar

#18 David Grudl http://davidgrudl.com nový

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

Posláno 9. 7. 2009 v 19.07 | Odpovědět

#19 Prťka nový

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

Posláno 3. 8. 2009 ve 20.06 | Odpovědět

Zanechat komentář

  • na jiné komentáře odkazujte zápisem např. [2]
  • vaše IP bude zaznamenána a zobrazena
  • můžete použít Texy! syntaxi. HTML značky nejsou povolené. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`
  • můžeme si tykat
  • diskuse mohou být řešeny metodou Indiana Jones
Text komentáře
Kontakt (povinné)

(maskuje se)




Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

phpFashion © 2004, 2010 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

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