HttpUploadedFile getExtension()

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

Nebylo by možné, pro větší pohodlí, přidat metodu na zjištění přípony souboru?

public function getExtension()
{
  return pathinfo($this->name, PATHINFO_EXTENSION);
}

Editoval hanakus (11. 10. 2009 2:35)

Honza Kuchař
Člen | 1662
+
0
-

Praktické využití? HttpUploadedFile umí pracovat s mime-typy. Což je mnohem spolehlivější, než ověřovat příponu souboru.

JakubKohout
Člen | 92
+
0
-

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

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

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

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

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

Něco mi uniká nebo je opravdu postatně jednodušší změnit příponu souboru než zfalšovat hlavičky mime typu?

hanakus
Člen | 22
+
0
-

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).

kravčo
Člen | 721
+
0
-

hanakus napsal(a):

Takže, proto bych chtěl udělat validaci na příponu (popř. na hlavičku formátu).

Teším sa na ňu.

Honza Kuchař
Člen | 1662
+
0
-

asi nemas rozsireni finfo na win standardne neni

David Grudl
Nette Core | 8218
+
0
-

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

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

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

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ů) !!!!!!