Validace formulare na priponu souboru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
bene
Člen | 82
+
0
-

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.

toka
Člen | 253
+
0
-

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');
bene
Člen | 82
+
0
-

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:

  1. Chci nahrávat i jiné soubory než obrázky (např. zip, rar, xml, doc, …).
  2. 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.

toka
Člen | 253
+
0
-

To tvoje řešení by vlastně šlo udělat už i na straně klienta přes JS. Teď když se nad tím zamýšlím, a nad tvými důvody, tak je to vlastně super nápad. Zkusím se na to podívat, implementovat, protože se mi dneska nechce nic „pracovního“ dělat a předložit :-D Nebo už něco máš?

Aurielle
Člen | 1281
+
0
-

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.

bene
Člen | 82
+
0
-

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 | 8147
+
0
-

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
+
0
-

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
+
0
-

Ke čtení na toto téma doporučuji tenhle článek od srigiho: http://blackhole.sk/…-gif-obrazky

A extension samozřejmě validuji…