Autor Zpráva
Tomashekk
Profil
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
Tomashekk:
Na rozlišení ti postačí funkce getImageSize a diakritiku a mezery si můžeš str_replacenout.
Tomashekk
Profil
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
Tomashekk:
Pozor na tento script. Obsahuje bezpečnostní díru.
pcmanik
Profil
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
Keeehi:
v čem je tam díra?
denCo
Profil
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
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
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
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
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
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
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
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
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
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
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
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
Keeehi:
Odtial to mam aj ja :D
Tomashekk
Profil
Keeehi:
děkuji, vše si dnes večer nastuduji
Tomashekk
Profil
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
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
pcmanik:
promiň pak jsem si toho všiml, kod jsme už upravil... takto by to mohlo být ok ne?
pcmanik
Profil
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
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
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
holi:
Ten tvůj kód neřeší bezpečností riziko popsané v [#14].

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: