Autor | Zpráva | ||
---|---|---|---|
Gecko Profil * |
#1 · Zasláno: 31. 1. 2010, 11:59:35
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=\"<img src='http:".$uvozovky."".$uvozovky."www.smetka.net/soubory/".$rand.".jpg' alt='Velikost - ".$velikost." kB' />\" 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 |
#2 · Zasláno: 31. 1. 2010, 12:29:23
pridej image/pjpeg
|
||
Gecko Profil * |
#3 · Zasláno: 31. 1. 2010, 12:50:13
Takto?
if($_FILES['obrazek']['type']=="image/pjpeg" or $_FILES['obrazek']['type']=="image/pjpg"){ |
||
Gecko Profil * |
#4 · Zasláno: 31. 1. 2010, 13:05:32
Tedy takhle
if($_FILES['obrazek']['type']=="image/jpeg" or $_FILES['obrazek']['type']=="image/jpg" or $_FILES['obrazek']['type']=="image/pjpeg"){ |
||
AM_ Profil |
#5 · Zasláno: 31. 1. 2010, 13:29:21
funguje ti to nebo ne?
|
||
Carrot Profil * |
#6 · Zasláno: 31. 1. 2010, 13:36:09
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 * |
#7 · Zasláno: 31. 1. 2010, 13:51:03
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 |
#8 · Zasláno: 31. 1. 2010, 20:10:12
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 |
#9 · Zasláno: 31. 1. 2010, 20:35:38
Carrot:
„Typ souboru kontroluj podle přípony - MIME typ jde lehce podvrhnout.“ Příponu umí podvrhnout i malé děti. |
||
AM_ Profil |
#10 · Zasláno: 31. 1. 2010, 21:11:00
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 * |
#11 · Zasláno: 31. 1. 2010, 22:13:53
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 |
#12 · Zasláno: 31. 1. 2010, 23:48:26
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 |
#13 · Zasláno: 1. 2. 2010, 01:29:29
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 |
#14 · Zasláno: 1. 2. 2010, 01:54:09
AM:
Chces rict ze je lepsi kontrolovat priponu nez MIME typ? |
||
Carrot Profil * |
#15 · Zasláno: 1. 2. 2010, 01:56:01
Samozřejmě - ta je rozhodující pro zpracování na serveru.
|
||
AM_ Profil |
#16 · Zasláno: 1. 2. 2010, 09:37:03
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. |
||
Časová prodleva: 14 let
|
0