Autor Zpráva
koudelacek
Profil *
Zdravím.

Chci se zeptat - mám sestavený formulář na nahrávání souborů, ale problém s výpisem chyb.
Mám povoleny přípony jpg, jpeg, gif, png, doc, docx a pdf.

Když se pokusím nahrát soubor 56 MB velký pps, nevypíše to žádnou chybu - ani velký soubor, ani špatná přípona a formulář se navíc celý vymaže..
Když jsem se pokusil nahrát soubor 100 kB .srt ( titulky ), vypsalo to špatná přípona.

1) Chápu to správně, že pokud je soubor větší než 2 MB jak jsem se dočetl, tak se neodešlou žádné data vůbec ?
2) Ale jaktože se mi smazal celý formulář ?
3) Je pro to nějaké řešení, když to mám v mém případě spojené i s normálním formulářem ?
4) Ještě se chci zeptat, jestli je vhodně řešeno zjištění typu souboru, pro případ kdy by se uživatel snažil to obejít přejmenováním souboru apod.

Děkuji za opovědi.

Pokud mám tedy toto

 
    $koncovky = array('jpg', 'jpeg', 'png', 'gif', 'doc', 'docx', 'pdf');
    $koncovky2 = array('jpg', 'jpeg', 'png', 'gif');
        
    if(!$_POST['title'])
      { echo '<p class="error">Nebyl vyplněn titulek...</p>'; }
    elseif(!$_POST['specialization'])
      { echo '<p class="error">Nebylo vyplněno.. .</p>'; }    
    elseif(!$_POST['target_group'])
      { echo '<p class="error">Nebyla vyplněna..</p>';}    
    elseif(!$_POST['description'])
      { echo '<p class="error">Nebyl vyplněn ...</p>';}    
     ....
     ....
     ....
     ....
    elseif ($_FILES["attachment"]["error"]) {
        echo '<p class="error">Soubor se nepodařilo nahrát!</p>\n';
      } 
    elseif (!in_array(strtolower(pathinfo($_FILES["attachment"]["name"], PATHINFO_EXTENSION)), $koncovky)) {
        echo '<p class="error">Koncovka souboru musí být jedna z: ' . implode(", ", $koncovky) . '.</p>\n';
      }
    elseif (in_array(strtolower(pathinfo($_FILES["attachment"]["name"], PATHINFO_EXTENSION)), $koncovky2) && !(@$imagesize = getimagesize($_FILES["attachment"]["tmp_name"])) || @$imagesize[2] > 3 ) {
        echo '<p class="error">Typ obrázku musí být JPG, JPEG, PNG nebo GIF.</p>\n';
      }
    else {echo 'V pohodě.'; }
ShiraNai7
Profil
Pokud se odesle vice dat nez je povoleno, tak se skript vubec nespusti. Limit je rizen PHP direktivami upload_max_filesize a post_max_size (zalezi na tom, ktery je mensi).
koudelacek
Profil *
Ale tak jak se vyhnu tomu, aby se vymazal celý formulář ?
ShiraNai7
Profil
Upozornit uzivatele na konkretni maximalni velikost uploadu :)
koudelacek
Profil *
Aha, ok :)

A prosimte k tomu 4) Ještě se chci zeptat, jestli je vhodně řešeno zjištění typu souboru, pro případ kdy by se uživatel snažil to obejít přejmenováním souboru apod.
mi poradis ?
Keeehi
Profil
koudelacek:
Ale tak jak se vyhnu tomu, aby se vymazal celý formulář ?
Nevyhneš. Musel by jsi velikost souboru otestovat už u uživatele což však javascript nezvládne. Řešením by bylo uploadify, které to zjistit umí (nepoužívá JS ale Flash).

4) - snad je to OK
koudelacek
Profil *
Potřeboval bych to vědět jistě, bude to celkem důležité. Mám se ještě poptat ?
Alphard
Profil
Smazání formuláře lze zabránit paralelním odesíláním souboru (upload selže, ale formulář přežije), existuje hromada uploaderů.

Zjišťování typu je problém, docela spolehlivé je getimagesize() pro obrázky, ale i tam může projít komentář se škodlivým kódem. Zásadní je neumožnit upload souboru pod názvem s koncovkou, kterou by vykonal váš server.
martin1312
Profil
niekde som videl zakázanie vykonania php cez .htaccess. Do priečinku, kde sa ukladajú uploadované súbory sa hodil ten súbor .htaccess. Neviem ale kde to už bolo, ani čo v tom .htaccess bolo napisane. Stačí googlit :)
Alphard
Profil
http://stackoverflow.com/questions/1271899/disable-php-in-directory-including-all-sub-directories-with-htaccess
Konkrétně php_flag engine off
Ale nemusí to být povolené, takže ověřit.
martin1312
Profil
Alphard:
presne to
koudelacek
Profil *
Díky :)
Keeehi
Profil
koudelacek:
Potřeboval bych to vědět jistě, bude to celkem důležité. Mám se ještě poptat ?
Kontrolování koncovek oproti whitelistu je výborná metoda zabezpečení. Pokud funkce pathinfo VŽDY vrátí znaky za poslední tečkou, tak je vše v pořádku. Funkci patinfo nepoužívám, takže nemám ověřeno, zda nejde nějak obejít. Pokud je spolehlivá, je vše v pořádku. ( Pokud to běží na Apache, tak je ještě potřeba, aby koncovky jpg, jpeg, png, gif, doc, docx, pdf apache znal. Což by u těchto měl. )
koudelacek
Profil *
Našel jsem někde, že je dobré používat např. mime_content_type, které je teď nahrazeno funkcí FileInfo() - má s tím někdo zkušenosti ?
nemeja
Profil
jenze ty koncovku nemas umoznenou. Pridej si ji hned do toho prvniho pole

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: