Upload files – only *.doc format

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

Ahoj,
potřeboval bych uploadovat soubory pouze typu .doc, ostatní aby to nebralo. Děkuji za pomoc
J.

Darkry
Člen | 101
+
0
-

Pravidlo Form::MIME_TYPE nefunguje? (application/msword)

Editoval Darkry (13. 5. 2012 11:43)

Juve
Člen | 27
+
0
-

Prosím tě napsal bys sem přímo funkční kód? Pokud je to jen na pár řádků?

Darkry
Člen | 101
+
0
-

Ale nic nezaručuju. Ještě si pohlídej jmenné prostory (musíš mít na začátku souboru use Nette\Forms\Form;.

$form->addUpload('dokument', 'Nahrajte soubor: ')->addRule(Form::MIME_TYPE, "Neplatný formát souboru.", "application/msword");

Editoval Darkry (13. 5. 2012 12:00)

nanuqcz
Člen | 822
+
0
-

MIME_TYPE se dá falšovat, doporučuju kontrolovat spíš koncovku. Tedy něco takového:

$form->addUpload('document', 'Dokument')
	->addRule(Form::MIME_TYPE, 'Neplatný formát souboru', 'application/msword')
	->addRule(Form::PATTERN, 'Neplatný formát souboru', '\\.doc$');  // snad bude fungovat, netestováno

Editoval nanuqcz (13. 5. 2012 12:04)

jtousek
Člen | 951
+
0
-

Popravdě se divím, že přímo v Nette není validátor na koncovky souborů, kterému bych jen předal pole povolených koncovek. (I když je fakt, že napsat to by asi moc dlouho netrvalo. Uvidím až to budu potřebovat.)

22
Člen | 1478
+
0
-

nanuqcz napsal(a):

MIME_TYPE se dá falšovat, doporučuju kontrolovat spíš koncovku. Tedy něco takového:

$form->addUpload('document', 'Dokument')
	->addRule(Form::MIME_TYPE, 'Neplatný formát souboru', 'application/msword')
	->addRule(Form::PATTERN, 'Neplatný formát souboru', '\\.doc$');  // snad bude fungovat, netestováno

a koncovka se jako falšovat nedá? :-) to je ještě horší doporučení, než kontrolovat MIME imho teda.

Editoval 22 (13. 5. 2012 12:29)

Darkry
Člen | 101
+
0
-

22 napsal(a):

a koncovka se jako falšovat nedá? :-) to je ještě horší doporučení, než kontrolovat MIME imho teda.

Zkontrolovat oboje ničemu neuškodí ;).

22
Člen | 1478
+
0
-

Když už si někdo dá tu práci a podvrhne MIME, tak určitě to pošle se špatnou koncovkou.

Juve
Člen | 27
+
0
-

Pokud přidám pouze pravidlo takto:

<?php
$form->addUpload('document','Vybrat soubor')
                ->addRule(Form::MIME_TYPE, "Neplatný formát souboru.", "application/msword");
?>

tak mi to vyhodí vyjímku „Neplatný formát souboru.“ vždy, když se snažím uploadovat jakýkoliv formát (.doc, .docx, txt).
Bez žádného pravidla mi to uploaduje správně, ale všechny formáty.
Místo řádku nahoře jak mi radil Darkry mam pouze:
use Nette\Application\UI\Form;
…jestli to nevadí…

Prosím o další rady, co můžu mít špatně…

nanuqcz
Člen | 822
+
0
-

22 napsal(a):
a koncovka se jako falšovat nedá? :-) to je ještě horší doporučení, než kontrolovat MIME imho teda.

Jde mi hlavně o to, aby ti tam někdo neuploadnul .php soubor s nějakým nebezpečným skriptem. Pokud pošle .php soubor se změněnou koncovkou (např .doc), pak se o bezpečnostní ohrožení nejedná, protože server se standardním nastavením takový skript nespustí.

Naopak pokud na serveru kontroluješ jen MIME_TYPE, tak ti tam pošlu .php soubor (skript) s nastaveným MIME_TYPE „application/msword“ a problém je na světě. Do takového skriptu může útočník napsat cokoli a na serveru ti to pak spustit (pokud nepoužíváš dodatečné opatření jako .htaccess v adresáři pro upload se zákazem spouštění php apod. – kontrola přípony mi ale přijde jednodušší).

Editoval nanuqcz (13. 5. 2012 12:52)

22
Člen | 1478
+
0
-

Jo, tak to máš pravdu, pokud má někdo povolené v adresáři pro upload spouštění scriptů, tak pak ano.

Editoval 22 (13. 5. 2012 14:34)

Juve
Člen | 27
+
0
-

Juve napsal(a):

Pokud přidám pouze pravidlo takto:

<?php
$form->addUpload('document','Vybrat soubor')
                ->addRule(Form::MIME_TYPE, "Neplatný formát souboru.", "application/msword");
?>

tak mi to vyhodí vyjímku „Neplatný formát souboru.“ vždy, když se snažím uploadovat jakýkoliv formát (.doc, .docx, txt).
Bez žádného pravidla mi to uploaduje správně, ale všechny formáty.
Místo řádku nahoře jak mi radil Darkry mam pouze:
use Nette\Application\UI\Form;
…jestli to nevadí…

Prosím o další rady, co můžu mít špatně…

Poradil by mi někdo ještě s tímhle prosím?

jtousek
Člen | 951
+
0
-

Nejspíš je špatně ten mime type. Při nahrání validního souboru si vydumpuj $_FILES a podívej se tam. Dle mých zkušeností totiž různé prohlížeče z nepochopitelných důvodů posílají různé mime typy pro stejné soubory.

castamir
Člen | 629
+
0
-

Zde jsou MIME_TYPE pro jednotlivé typy souborů MS Office. Možná je taky problém v samotném dokumentu (Kdo ví, jak ukládá MS Office 2007+ staré .doc soubory)…

Editoval castamir (13. 5. 2012 15:21)

petr.pavel
Člen | 535
+
0
-

@Juve: Myslím, že Firebug by ti měl ukázat, jaký mime_type skutečně posílá tvůj prohlížeč.
Případně si do validateMimeType přidej dump, abys viděl, co s čím porovnáváš.

Ještě doplnění ke kontrole koncovek:
@nanuqcz to vysvětlil pěkně, jen bych doplnil, že některé servery (např. výchozí nastavení Plesku) povolují spouštět jako PHP všechny soubory, které mají .php kdekoliv v názvu – tj. nejen na konci. Detaily, viz bod 8.
Takže když někdo nahraje bububu.php.doc, tak to půjde spustit. Mám s tím osobní zkušenost.