Ochrana před UTF-8 útokem
- David Grudl
- Nette Core | 8218
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
.