Ochrana před UTF-8 útokem

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8218
+
0
-

Implementoval jsem do Nette ochranu před UTF-8 útokem. O co jde? Ne každá posloupnost bajtů tvoří validní UTF-8 řetězec – naopak kódování probíhá podle přesných pravidel. Co by se ale stalo, kdy aplikace dostala zvenčí řetězec, který je UTF-8 nevalidní? Pokud by se například použil v SQL příkazu u databáze MySQL, ta by vyhodila chybu #1300 Invalid utf8 character string. Naopak SQLite, která kontrolu kódování neprovádí, by jej akceptovala a mohl by se zavléci dovnitř datového module aplikace. Což je problém – pokud se takový řetězec dostane na výstup, způsobí selhání XML parserů (tj. web by generoval např. nevalidní RSS výstupy) a podobně.

Ochranu jsem implementoval na nejnižší úrovni (třida HttpRequest) + doplňková v routeru. Aktivuje ji příkaz $httpRequest->setEncoding('UTF-8'); v souboru Application.php a dále $path = String::fixEncoding($path); v souboru Route.php.