Validace formulare na priponu souboru
- bene
- Člen | 82
Bylo by možné přidat pro nahravání souboru validaci na příponu?
Vzhledem k tomu, že přípona určuje jak webserver se souborem bude zacházet, je nevalidování přípony souboru velká bezpečnostní díra. Samozřejmě, předpokládám, že si to každý validuje sám v aplikaci. Možnost nastavit validaci při definici formuláře odpadá nutná kontrola po validaci (v callbacku na tlačítko).
Navrhuji
addRule(Form::FILE_EXT, 'Přípona souboru není podporována. Podporované soubory jsou %a', array('png', 'jpg', 'jpeg', 'gif'));
,
kde %a
uděla implode(', ', $array)
(pokud tento
identifikátor již není implementovaný) a kontrola přípon je case
insensitive.
Dík.
- bene
- Člen | 82
toka napsal(a):
Nestačí ti toto?
$form->addFile('obrazek', 'Obrázek:') ->addCondition(Form::FILLED) ->addRule(Form::MIME_TYPE, 'Obrázek musí být ve formátu JPEG nebo PNG', 'image/jpeg,image/png');
Nestačí, dva důvody:
- Chci nahrávat i jiné soubory než obrázky (např. zip, rar, xml, doc, …).
- MIME se dá tuším podvrhnout, takže pokud uložíš podvrhnutý obrázek s příponou php, tak máš díru jak …
Kontrola přípony je správná a účinná. I kdyby ti někdo nahrál php kód v souboru s příponou gif, tak je mu to houby platné. Webserver s ním bude zacházet jako s obrázkem.
- bene
- Člen | 82
gmvasek napsal(a):
bene: MIME se dá podvrhnout, ale ne na straně serveru. Nette kontroluje na straně serveru, takže nahrávání škodlivých souborů nehrozí. Ale kontrolovat příponu se vyplatí, dělám to taky.
Zkus si vzít gif. Přejmenuj ho na obrazek.php
. Zedituj ho a na
konec přidej <?php echo 'obrazek'
.
Pak si udělej skript print_r(getimagesize('obrazek.php'));
.
Zjistíš následující:
Array
(
[0] => 600
[1] => 261
[2] => 1
[3] => width="600" height="261"
[bits] => 4
[channels] => 3
[mime] => image/gif
)
Když ale spustíš soubor obrazek.php
tak se ti vypíší
všelijaké znaky, ale hádej co je na konci…
MIME se dá podvrhnout a pokud se na něj někdo spoléhá ohledně obrázků, má v aplikaci díru.
V Nette 1.0 přibyla validace na obrázek pro input type file. Ovšem na tuto validaci se nemůžeš spolehnout. Nette se prezentuje jako bezpečný frame, ale zde je „díra/nebezpečí“, pokud se proramátor spolehne pouze na tuto validaci.
Sor jestli jsem tě zklamal ;-)
- David Grudl
- Nette Core | 8218
Důležité je neudělat tu ptákovu, že bych soubor uložil pod jménem, které mi poslal klient. Název včetně správné koncovky musím vytvořit sám. V případě obrázků je navíc možné je přeuložit, tedy zavolat –>toImage()->save(…)
- bene
- Člen | 82
David Grudl napsal(a):
Důležité je neudělat tu ptákovu, že bych soubor uložil pod jménem, které mi poslal klient. Název včetně správné koncovky musím vytvořit sám. V případě obrázků je navíc možné je přeuložit, tedy zavolat –>toImage()->save(…)
Naprosto souhlasím. Bohužel, pokud existuje validace na
Form::IMAGE
, tak by někdo mohl předpokládat, že ukládá
skutečně obrázek. Jen jsem chtěl poukázat na nebezpečí které může
z vzniknout z neznalosti jak Nette validuje obrázky. Dalo by se to vyřešit
např. „tvrdší“ kontrolou např. Form::REAL_IMAGE
kde by se
kontrolovala i koncovka.
Přesto bych uvítal (snad ne sám), pokud by šla udělat validace
Form::FILE_EXT
.
- Aurielle
- Člen | 1281
Ke čtení na toto téma doporučuji tenhle článek od srigiho: http://blackhole.sk/…-gif-obrazky
A extension samozřejmě validuji…