Autor | Zpráva | ||
---|---|---|---|
Tomashekk Profil |
#1 · Zasláno: 6. 1. 2011, 14:34:34
Mám svůj script na upload fotografie, akorát bych tam potřeboval dodělat omezení (max rozlišení). Pomocí čeho a jak přesněji by to šlo udělat? A ještě když v názvu obsahuje diakritiku či mezeru, aby i toto bylo napraveno
if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/pjpeg")) && ($_FILES["file"]["size"] < 200000)) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "../foto/".$_POST['slozka']."/" . $_FILES["file"]["name"]); echo "Stored in: " . "../foto/".$_POST['slozka']."/" . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; } } else { print "Špatná proměnná"; } |
||
Medvídek Profil |
#2 · Zasláno: 6. 1. 2011, 14:39:51
Tomashekk:
Na rozlišení ti postačí funkce getImageSize a diakritiku a mezery si můžeš str_replacenout. |
||
Tomashekk Profil |
#3 · Zasláno: 6. 1. 2011, 14:46:54 · Upravil/a: Tomashekk
Medvídek:
$max_width = 100; $max_height = 100; list($width, $height) = getimagesize($img_path); Takže toto mi pomůže?, jenže já nějak nepobírám jak bych to testoval. V podstatě jsem celkem ani nepobral jak se s tím pracuje aha, zda to chápu. tak to list..... mi uloží jen do $width a $height rozměry daného obrázku, že ano? |
||
Keeehi Profil |
#4 · Zasláno: 6. 1. 2011, 16:19:44
Tomashekk:
Pozor na tento script. Obsahuje bezpečnostní díru. |
||
pcmanik Profil |
#5 · Zasláno: 6. 1. 2011, 16:20:29
Mas to nedostatocne zabezpecene, daj si tam este tieto podmienky:
$image = getimagesize($_FILES['file']['tmp_name']); if($image['mime'] != 'image/gif' && $image['mime'] != 'image/jpeg' && $image['mime'] != 'image/jpg') die ("Akceptujeme len jpg, jpeg, gif."); Taktiez: if (!$_FILES || $_FILES["file"]["error"] == UPLOAD_ERR_INI_SIZE) die ( "Súbor je príliš velký."); Preto aby si zistil ci subor neprekrocil max. velkost nastavenu v php.ini |
||
Tomashekk Profil |
#6 · Zasláno: 6. 1. 2011, 16:22:24
Keeehi:
v čem je tam díra? |
||
denCo Profil |
#7 · Zasláno: 6. 1. 2011, 16:32:46
pcmanik:
„Preto aby si zistil ci subor neprekrocil max. velkost nastavenu v php.ini“ To je načo dobré? Veď keď testuje svoju veľkosť, veľkosť nastavená v php.ini ho asi nebude zaujímať. |
||
pcmanik Profil |
#8 · Zasláno: 6. 1. 2011, 16:52:15 · Upravil/a: pcmanik
denCo
Preco asi trocha porozmyslaj, aha, zmeni hosting, a bude tam mensie nastavenie v php.ini ako je tych jeho 200 000 a co sa stane? No nic sa neodosle... |
||
Keeehi Profil |
#9 · Zasláno: 6. 1. 2011, 18:27:06
pcmanik:
Bohužel ani přidáním kódu od pcmanika tu chybu neopravíš. Řešení vám neřeknu, zkuste na to přijít sami. Možná vám později doporučím nějaký studijní odkaz. |
||
pcmanik Profil |
#10 · Zasláno: 6. 1. 2011, 18:45:48
Keeehi:
Ak narazas na to ze do gifu sa da vlozit php kod o tom viem, poznam aj riesenie, ale tak ako ani majster kulinar neprezradi vsetko, tak aj ja si necham nejake drobnosti pre seba :) |
||
Keeehi Profil |
#11 · Zasláno: 6. 1. 2011, 18:49:59
pcmanik:
Problém je, že dáváš Tomashekkovi pocit falešného bezpečí, že když to tam přidá, tak to bude v pořádku. Měl jsi tedy do příspěvku napsat, že to sice bezpečnost zvyšuje, avšak pořád tam bezpečnostní díra je. Paradoxně jsi svým příspěvkem napáchal více škody než užitku. |
||
imploder Profil |
#12 · Zasláno: 6. 1. 2011, 19:03:07 · Upravil/a: imploder
pcmanik:
Taky vím o té chybě, co tam máš. Nebudu Keeehimu kazit zábavu, zkus na to přijít sám. Jenom tě ujišťuju, že má Keeehi pravdu: tvoje řešení opravdu bezpečné není. EDIT: Jenom napovím: není to chyba jako třeba překlep, nic takového; je to chyba z neznalosti. |
||
denCo Profil |
#13 · Zasláno: 6. 1. 2011, 19:32:09 · Upravil/a: denCo
pcmanik:
A keď to tam aj dá, čo sa stane? Aj tak sa neodošle, jediná vec čo zistí je to, že súbor je príliš veľký. Každopádne každý kto niečo takéto robí si musí hneď pozrieť/nastaviť php.ini, inak to je spoliehať sa na to, že sa možno do toho zmestím. „Ak narazas na to ze do gifu sa da vlozit php kod o tom viem, poznam aj riesenie, ale tak ako ani majster kulinar neprezradi vsetko, tak aj ja si necham nejake drobnosti pre seba :)“ To si robíš srandu, na čo je potom toto fórum? Ako keby to bolo nejaké perfektné riešenie, ktoré poznáš len ty. Tomashekk: Treba aj kontrolovať príponu súboru, či nie je škodlivá (.php, .php4, .php5 atď.) |
||
Davex Profil |
#14 · Zasláno: 6. 1. 2011, 19:37:20
denCo:
„Treba aj kontrolovať príponu súboru, či nie je škodlivá (.php, .php4, .php5 atď.)“ Nestačí kontrolovat pouze příponu. Na některých webserverech (namátkou třeba Sweb) se spustí i skript uložený v souboru s libovolnou příponou, třeba .php.jpg. |
||
denCo Profil |
#15 · Zasláno: 6. 1. 2011, 19:40:42
Davex:
Hej? To som nevedel... tak potom čo, kontrolovať celý súbor, či neobsahuje (.php, .php4, .php5 atď.)? V podstate by to mohlo šlapať, lebo tento reťazec asi v názve súboru nemá čo robiť. |
||
Keeehi Profil |
#16 · Zasláno: 6. 1. 2011, 19:53:28 · Upravil/a: Keeehi
Ano, stačí kontrolovat koncovku (nejlépe oproti whitelistu) a zkontrolovat nastavení servru. Případně pokud to není správně nastaveno, pokusit se s tím něco udělat pomocí htaccess. Pokud se to ovšem nastavit nedá, bude se to muset řešit na úrovni scriptu.
Řešením taky je nedovolit přímý přístup do složky z venku a soubory zpřístupňovat stylem: soubory.php?jmeno=obrazek.jpg |
||
Davex Profil |
#17 · Zasláno: 6. 1. 2011, 20:05:57
denCo:
„kontrolovať celý súbor, či neobsahuje (.php, .php4, .php5 atď.)?“ Asi bych povolil ve jméně souboru jen jednu tečku. Na serveru mohou být spustitelné ještě další skripty, které se v kontrole přípony \.ph(p[345]?|tml) nezachytí.
Ještě by se dalo kontrolovat, zda je v souboru opravdu obrázek, ale určitě půjde vytvořit skript, který bude zároveň platným obrázkem. |
||
Keeehi Profil |
#18 · Zasláno: 6. 1. 2011, 20:13:29 · Upravil/a: Keeehi
Davex:
„ale určitě půjde vytvořit skript, který bude zároveň platným obrázkem“ Ano, to jde. To je právě problém u [#5] (o [#1] ani nemluvím, tam takto sofistikovaný útok ani není třeba). Tomashekk, pcmanik: Jak jsem slíbil, tady je odkaz: http://blackhole.sk/topicupload-suborov-v-php-nebezpecne-gif-obrazky |
||
pcmanik Profil |
#19 · Zasláno: 6. 1. 2011, 21:01:24
Keeehi:
Odtial to mam aj ja :D |
||
Tomashekk Profil |
#20 · Zasláno: 6. 1. 2011, 21:25:58
Keeehi:
děkuji, vše si dnes večer nastuduji |
||
Časová prodleva: 7 dní
|
|||
Tomashekk Profil |
#21 · Zasláno: 13. 1. 2011, 23:05:48 · Upravil/a: Tomashekk
Takže stačí využívat kód co má uveden v upload4.php?
<?php $imageinfo = getimagesize($_FILES['userfile']['tmp_name']); if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') { $blacklist = array(".php", ".phtml", ".php3", ".php4"); foreach ($blacklist as $item) { if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) { echo "We do not allow uploading PHP files\n"; exit; } exit; } } $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "File is valid, and was successfully uploaded.\n"; } else { echo "File uploading failed.\n"; } ?> Zdá se mi, že zde chybí testování zda gif neobsahuje PHP skript v komentáři. |
||
pcmanik Profil |
#22 · Zasláno: 13. 1. 2011, 23:10:29 · Upravil/a: pcmanik
Myslim, ze autor to tam dostatocne jasne napisal:
K ideálnej ochrane je teda vhodné skombinovať postupy v skriptoch upload3.php a upload4.php (prip upload2.php). Toto už prenechávam na zdatných web-developerov. |
||
Tomashekk Profil |
#23 · Zasláno: 13. 1. 2011, 23:11:29
pcmanik:
promiň pak jsem si toho všiml, kod jsme už upravil... takto by to mohlo být ok ne? |
||
pcmanik Profil |
#24 · Zasláno: 13. 1. 2011, 23:16:46
Ani nie, namiesto blacklist sa odporuca pouzit white list, totizto uz ti tam chyba pripona .php5
Ak by niekto chcel nahrat subor jpg tak mu to neprejde. |
||
Tomashekk Profil |
#25 · Zasláno: 13. 1. 2011, 23:18:42 · Upravil/a: Tomashekk
pcmanik:
hele jako mne jde o to, nahrávání pouze JPG a PNG... gif mne nejak nebere.. takze teoreticky by stacilo toto ne? <?php $imageinfo = getimagesize($_FILES['userfile']['tmp_name']); if($imageinfo['mime'] != 'image/png' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg') { exit; } if($imageinfo[0] > 800 && imageinfo[1] > 800){ echo "Rozlišení obrázku je moc velké!"; exit; } if($_FILES["file"]["size"] < 200000 || !$_FILES || $_FILES["file"]["error"] == UPLOAD_ERR_INI_SIZE){ echo "Velikost obrázku je velká!"; exit; } } $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (file_exists("uploads/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "Nahrání obrázku bylo úspěšné.\n"; } else { echo "Nahrávání obrázku selhalo.\n"; } } ?> |
||
holi Profil |
#26 · Zasláno: 15. 1. 2011, 01:45:57
Proč kontrolu tak složitě?
<? //Soubory které mohou být nahrány $kontrola = Array ('png', 'jpg', 'jpeg'); //Zjištění formátu nahrávaného souboru $koncovka = PathInfo($_FILES['File']['name']); //kontrola koncovky s těmi v poly "$kontrola" if (!In_Array(StrToLower($koncovka['extension']), $kontrola)) { echo "Vkládaný soubor není obrázek!"; exit; }?> |
||
Davex Profil |
#27 · Zasláno: 15. 1. 2011, 12:48:03
holi:
Ten tvůj kód neřeší bezpečností riziko popsané v [#14]. |
||
Časová prodleva: 14 let
|
0