Autor Zpráva
Gecko
Profil *
Zdravím,
na této stránce mám script na upload obrázků.
Kód je zde:
<?php
// Nadefinované proměnné
$uvozovky = "/";
$rand = rand(1000000, 9999999);

// Sestavení kódu pro formulář
$output="<form action=\"\" method=\"post\" enctype=\"multipart/form-data\">
Soubor: <input name=\"obrazek\" type=\"file\">
<input type=\"submit\" value=\"Nahrát obrázek\"></form>
<p>Potvrzuji že nebudu nahrávat:</p>
<ul>
<li>Pornografický materiál</li>
<li>Rasistické obrázky</li>
<li>Či jinak pohoršující či ponižující obsah</li>
</ul>

";

// Podmínka if
if (is_uploaded_file($_FILES['obrazek']['tmp_name']))  { 
if($_FILES['obrazek']['type']=="image/jpeg" or $_FILES['obrazek']['type']=="image/jpg"){  

// Fce copy, zjisteni velikosti
$zkopiruj = move_uploaded_file($_FILES['obrazek']['tmp_name'],  soubory."/$rand.jpg"); 
$velikost=round(@filesize($_FILES['obrazek']['tmp_name']));

// Provede se $zkopiruj
if($zkopiruj == true){   
$output="<div class=\"message1\">Obrázek <strong>".$rand.".jpg</strong> byl úspěšně nahrán na server.</div>
<ul>
<li>Velikost souboru: ".$velikost." kB</li>
<li>Náhled obrázku: <a href=\"soubory/".$rand.".jpg\">".$rand.".jpg</a></li>
</ul>
HTML: <input onclick=\"this.select();\" value=\"&lt;img src='http:".$uvozovky."".$uvozovky."www.smetka.net/soubory/".$rand.".jpg' alt='Velikost - ".$velikost." kB' /&gt;\" size=\"85\">
<h3>Náhled</h3>
<div align=\"center\"><small>Obrázek může být v náhledu deformován.</small><br />
<a href=\"soubory/".$rand.".jpg\"><img src=\"soubory/".$rand.".jpg\" width=\"500px\"/></a>
</div>";

//Soubor neprošel
}else{ 
$output="Soubor nemohl být nahrán.\nPočet chyb: " . $_FILES['obrazek']['error']; 
} 
}else{ 
$output= "Lze nahrávat pouze soubory typu \"jpg\" a \"jpeg\"!"; 
} 
}
?>


Problém je v tom, že IE nebere obrázky s příponou JPG a JPEG, ale jpg a jpeg ano.
Nevím kde je zakopán pes, ale ff i opera tohle berou v pohodě.
Kcko
Profil
pridej image/pjpeg
Gecko
Profil *
Takto?
if($_FILES['obrazek']['type']=="image/pjpeg" or $_FILES['obrazek']['type']=="image/pjpg"){  
Gecko
Profil *
Tedy takhle
if($_FILES['obrazek']['type']=="image/jpeg" or $_FILES['obrazek']['type']=="image/jpg" or $_FILES['obrazek']['type']=="image/pjpeg"){
AM_
Profil
funguje ti to nebo ne?
Carrot
Profil *
 Typ souboru kontroluj podle přípony - MIME typ jde lehce podvrhnout.
 Nemůžeš zjišťovat velikost temp souboru - k němu nemají na většině hostingů filesystemové funkce přístup.
Gecko
Profil *
Carrot:
Typ souboru kontroluj podle přípony - MIME typ jde lehce podvrhnout.

To se dělá jak?

Nemůžeš zjišťovat velikost temp souboru - k němu nemají na většině hostingů filesystemové funkce přístup.
To opravím.

AM:
Ano, ten druhy zapis funguje.
AM_
Profil
Gecko:
„Typ souboru kontroluj podle přípony - MIME typ jde lehce podvrhnout.“
>
To se dělá jak?
místo ['obrazek']['type'] vezmeš ['obrazek']['name'] , vezmeš vše za poslední tečkou (nejsnažší pomocí explode() ) a máš příponu. Pro jistotu je dobré uploadovat soubory do adresáře, kde vypneš možnost vykonávání PHP (to lze tuším nějak přes HTACCESS, pokud to vůbec na daném hostingu nastavit jde)
Bubák
Profil
Carrot:
Typ souboru kontroluj podle přípony - MIME typ jde lehce podvrhnout.
Příponu umí podvrhnout i malé děti.
AM_
Profil
Bubák:
Příponu umí podvrhnout i malé děti.
ano, jenže k čemu ti bude, když na server nahraješ PHP skript s příponou JPG, tak ho pak nespustíš :)

Pokud jde o ochranu proti tomu, aby tam uživatelé nenahrávali takový typ obrázků/souborů, s jakým si webová aplikace neporadí, pak by podvrhování přípony abys jí tam procpal bylo spíš k pousmání. Aneb programy by měly být blbuvzdorné, ale prvotřídní blbec si vždycky cestu najde :)
Gecko
Profil *
AM:
['obrazek']['type'] vezmeš ['obrazek']['name']
Tohle bohužel nejde.
if($_FILES['obrazek']['name']=="image/jpeg" or $_FILES['obrazek']['name']=="image/jpg" or $_FILES['obrazek']['name']=="image/pjpeg"){ 

Když si někdo dá tu práci a nahraje tam obrazek.jpeg v němž bude PHP script (podvržený), tak to nespustí ne?
Kcko
Profil
Gecko:
Tohle bohužel nejde.
No jiste ze ne, vzdyt mas kontrolovat mime type cili type

http://php.vrana.cz/ukladani-souboru-od-uzivatele.php
AM_
Profil
Kcko:
cituji z tebou odkazované stránky:
V proměnné $_FILES['userfile']['type'] sice máme k dispozici typ nahraného souboru, tento typ ale nastavuje klient a může ho mít nastaven špatně, útočník ho navíc může snadno změnit. Lepší je tedy zjistit typ souboru na základě koncovky

Takže máš kontrolovat příponu, tedy část "name". Ha.

Gecko:
Tohle bohužel nejde.
"AM mi poradil něco s name, tak tam místo type dám name, to ostatní v jeho příspěvku jsou asi nějaké bláboly. Jé ono to nefunguje." Tak to bohužel není, nestačí jenom nahradit type za name, musíš si z toho name vypreparovat příponu a tu pak porovnávat s povolenými příponami (jpeg, jpg, ...) a ne mime typy (image/*).
Kcko
Profil
AM:
Chces rict ze je lepsi kontrolovat priponu nez MIME typ?
Carrot
Profil *
Samozřejmě - ta je rozhodující pro zpracování na serveru.
AM_
Profil
Kcko:
Ano. Můžeš mi vysvětlit, k čemu je vůbec dobré kontrolovat MIME typ, když webový server se řídí dle přípon? Především v otázce bezpečnosti.

MIME je zde dobrý k jediné věci - pokud uploadované soubory nenabízíš ke stažení přímo, ale skrz nějaký PHP download script, tak si zapamatuješ, jaký měl uploadovaný soubor MIME typ (nebo jaký o sobě tvrdil, že má typ) a ten pak předáváš, když si ten soubor někdo stahuje.

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: