HttpUploadedFile getExtension()
- Honza Kuchař
- Člen | 1662
Praktické využití? HttpUploadedFile umí pracovat s mime-typy. Což je mnohem spolehlivější, než ověřovat příponu souboru.
- JakubKohout
- Člen | 92
ale MIME-typ se generuje na straně klienta takže se dá podvrhnout … kontrola přípony je nejlepší kontrolou jestli je to opravdu obrázek
- Panda
- Člen | 569
MIME-type se sice u klienta vygeneruje a odešle, ale Nette s ním vůbec nepracuje: https://api.nette.org/…ile.php.html#97.
- Ondřej Mirtes
- Člen | 1536
Podívej se na zdroják getContentType. Neboj, je to zabezpečené dobře.
EDIT: Sakra :o)
Editoval LastHunter (11. 10. 2009 13:29)
- hanakus
- Člen | 22
No, praktické využití – zjistil jsem, že např. při odesílání FLV videa místo MIME video/x-flv Nette dostane application/octet-stream. Kontroloval jsem to při odesílání přes Tamper Data (FF extension) a typ je nastaven správně, ale na serveru se změní na octet-stream. Buď je to nějakým nastavením serveru nebo neumí tento typ přijmout, nevím ale i kdyby, tak bych neměl možnost zasahovat do těchto nastavení. Mimo jiné do MIME si může napsat kdokoliv co chce, takže jediné spolehlivé řešení je kontrolovat příponu (a potom třeba ještě hlavičku formátu).
- JakubKohout
- Člen | 92
hanakus napsal(a):
No, praktické využití – zjistil jsem, že např. při odesílání FLV videa místo MIME video/x-flv Nette dostane application/octet-stream. Kontroloval jsem to při odesílání přes Tamper Data (FF extension) a typ je nastaven správně, ale na serveru se změní na octet-stream. Buď je to nějakým nastavením serveru nebo neumí tento typ přijmout, nevím ale i kdyby, tak bych neměl možnost zasahovat do těchto nastavení. Mimo jiné do MIME si může napsat kdokoliv co chce, takže jediné spolehlivé řešení je kontrolovat příponu (a potom třeba ještě hlavičku formátu).
Všechno je vidět v tom zdrojáku z API, kterej byl poslán vejš ;)
- Honza Marek
- Člen | 1664
Něco mi uniká nebo je opravdu postatně jednodušší změnit příponu souboru než zfalšovat hlavičky mime typu?
- hanakus
- Člen | 22
No pravda je, že se dá podvrhnout obojí. Do kódu jsem koukal a chápu,
že to ignoruje typ co přišel v hlavičce a získává ho to přes
finfo_file
. Ale já až tak neřeším jestli někdo něco
falšuje, jako spíš jestli se třeba neuklikl a místo fotky/videa tam
neposílá něco jiného.
Následující kód mi nefungoval (getContentType() vrací application/octet-stream a validace neprojde), nevím jestli je to nastavením serveru nebo ten typ fileinfo nezná.
$form->addFile('video',)
->addRule(Form::MIME_TYPE, 'Video může být pouze ve formátu FLV.', 'video/x-flv');
Takže, proto bych chtěl udělat validaci na příponu (popř. na hlavičku formátu).
- David Grudl
- Nette Core | 8218
honzakuchar napsal(a):
Praktické využití? HttpUploadedFile umí pracovat s mime-typy. Což je mnohem spolehlivější, než ověřovat příponu souboru.
Ne tak úplně.
Dám příklad: uživatel uploadne soubor, zkontrolujeme, že jde o PNG,
z názvu odstraníme speciální znaky a uložíme ho pod tímto názvem do
adresáře media
v document rootu. A bezpečnostní díra je
na světě.
K souboru se totiž bude přistupovat přes webový prohlížeč a
servírovat jej bude Apache, který se o obsah nezajímá a mime typ (a
handler) určuje podle přípony. Pokud tedy nahrajeme soubor nazvaný
obrazek.php
s hlavičkou skutečného PNG souboru, kontrolou MIME
type projde a když ho uložíme jako
document_root/media/obrazek.php
, bude se při přístupu spouštět
jako PHP.
- Honza Kuchař
- Člen | 1662
uložíme ho pod tímto názvem do adresáře media v document rootu
Já teda nevím, ale nic co uploaduju, tak nedávám přímo jako veřejně dostupné. Kvůli tomu vznikl FileDownloader, abych si mohl zkontrolovat, kdo si ten soubor stahuje. A aby pokud by byl spustitelný, tak aby se nespustil.
- David Grudl
- Nette Core | 8218
Kvůli výkonu je nejvhodnější, pokud např. obrázky servíruje přímo Apache, takže uživateli uploadovaná média se snažím dávat přímo do document_root.
- PetrP
- Člen | 587
Nevěřit tomu co mi pošle client, a ani obsahu souboru.
Toto je validní obrázek:
(gif.php)
GIF89a<?php unlink(__FILE__); Nette\Helpers::destroyServer(IMMEDIATELY); ?>
var_dump(getimagesize(dirname(__FILE__).'/gif.php'));
Tedy je pořeba hlavně zabezpečit koncovku, protože to je to podle čeho apache rozhoduje jak se bude se souborem nakladat.
(přidám ještě pár varovných vykřičníků) !!!!!!