Upload files – only *.doc format
- Darkry
- Člen | 101
Pravidlo Form::MIME_TYPE nefunguje? (application/msword)
Editoval Darkry (13. 5. 2012 11:43)
- nanuqcz
- Člen | 822
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)
- 22
- Člen | 1478
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)
- Juve
- Člen | 27
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
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)
- Juve
- Člen | 27
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?
- petr.pavel
- Člen | 535
@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.