Autor | Zpráva | ||
---|---|---|---|
RaZeM Profil |
#1 · Zasláno: 21. 2. 2012, 13:45:47
Potreboval by som zabezpecit upload do formatov napr. JPG a PNG, potom do urcitej velkost a meno obrazka podla ID alebo uzivatela.. skusal som tam dat nieco taketo ($_FILES["file"]["type"] == "image/jpeg") hociakym sposobom ale vzdy mi to potom neuploadovalo nic.. neviem kde tam dat nieco na to zabezpecenie vlozit..vedel by teda niekto tento kod nejakym sposobom zabezpecit?
<?php $error = "Nepripojilo sa."; $connect = mysql_connect("localhost", "blabla", "blabla") or die($error); mysql_select_db("razem") or die($error); session_start(); $id = $_SESSION['id']; if (isset($_POST['submit'])) { $name = $_FILES['avatar']['name']; $tmp_name = $_FILES['avatar']['tmp_name']; if ($name) { $location = "avatar/$name"; move_uploaded_file($tmp_name,$location); $query = mysql_query("UPDATE uzivatelia SET imagelocation='$location' WHERE id='$id'"); echo "<SCRIPT>"; echo "window.location.href='index.php?clanok=profil'"; echo "</SCRIPT>"; } else die("Prosim vyber obrazok"); } ?> <ul><form method="post"enctype="multipart/form-data"> <label>Meno avatara :</label> <input type="file" name="avatar"/> <br> <input type="submit" name="submit" value="Upload" /> </form></ul> |
||
Keeehi Profil |
#2 · Zasláno: 21. 2. 2012, 14:25:42
|
||
RaZeM Profil |
Tak z toho som trocha sprosty to sem neviem dosadit tu ochranu
|
||
martin1312 Profil |
#4 · Zasláno: 21. 2. 2012, 16:53:46
ked som robil ja upload obrazkov, ochranu som riesil podla tohto http://blackhole.sk/topicupload-suborov-v-php-nebezpecne-gif-obrazky .
|
||
RaZeM Profil |
#5 · Zasláno: 21. 2. 2012, 18:00:07
Skusam to nejak dopnit do toho mojho kodu ale nebere to stale
|
||
martin1312 Profil |
#6 · Zasláno: 21. 2. 2012, 18:14:40
RaZeM:
„nieco taketo ($_FILES["file"]["type"] == "image/jpeg") hociakym s“ nezabudas na to, ze tvoj input sa vola 'avatar' ? |
||
RaZeM Profil |
#7 · Zasláno: 21. 2. 2012, 18:39:09
to viem to som aj zmenil
|
||
martin1312 Profil |
#8 · Zasláno: 21. 2. 2012, 21:40:10
a ako to potom nefunguje? nahra obrazok aj ked je inych formatov, alebo nenahra nic, alebo co?
|
||
Keeehi Profil |
martin1312:
Nechci ti kazit radost, ale jestli jsi okopíroval ten jejich 4 kód tak ani ten není úplně bezpečný. Stačilo by pár úprav a bylo by to v pořádku. Ale zdá se mi, že napsat zabezpečený upload umí jen málokdo. Dokonce jsem viděl i v komentářích o tom zmínku. Bohužel tam nebylo napsáno, že ten problém se vyskytuje i v článku. Takže na jakou zranitelnost vlastně 4. kód trpí? Uploadovaný soubor: a.php.bflmpsvz
Obsah: <?php echo "PROBLÉM!"; ?> |
||
martin1312 Profil |
Keeehi:
diki za upozornenie, ale ten kod nemam okopirovany, iba som sa tym inspiroval. Mam tam podmienku, ze v nazve moze byt iba jedna "." (bodka). To by malo stacit ako prevecncia proti tomu, co si napisal. Alebo nie? EDIT: a samozrejme nepouzivam blacklist ale whitelist |
||
Keeehi Profil |
#11 · Zasláno: 21. 2. 2012, 22:13:22
martin1312:
V tvém případě to takto vypadá dobře. Potřeboval bych ale ten tvůj kód vidět, abych mohl o něm prohlásit, že je bezpečný. Spíše jde o to, že pokud by to RaZeM a nebo kdokoliv jiný z tebou odkázané stránky okopíroval, mohl by mít problém. |
||
martin1312 Profil |
Keeehi:
nejak narychlo som nevedel najst ten moj script, tak som ho napisal odznova priblizne rovnako: <?php $velkost = 1048576; //EDIT $error = ""; $podpora = array ( 'image/jpeg', 'image/pjpeg', 'image/png'); $podpora_pripona = array ( 'jpg', 'png'); //kontrola if ($_FILES["file"]["name"] != ""){ if (!in_array(strtolower($_FILES["file"]["type"]), $podpora)) $error = "Tento typ súboru nie je podporovaný. Povolené sú súbory .jpg a .png<br>\n" ; else { $info = getimagesize($_FILES["file"]["tmp_name"]); if (!in_array(strtolower($info['mime']), $podpora)) $error = "Tento typ súboru nie je podporovaný. Povolené sú súbory .jpg a .png<br>\n"; } if (substr_count($_FILES["file"]["name"], ".") != 1 ) $error = "Tento typ súboru nie je podporovaný. Povolené sú súbory .jpg a .png<br>\n"; list($meno, $pripona) = explode(".", $_FILES["file"]["name"]); if (!in_array(strtolower($pripona), $podpora_pripona)) $error = "Tento typ súboru nie je podporovaný. Povolené sú súbory .jpg a .png<br>\n"; if ($_FILES["file"]["size"] > $velkost) $error .= "Maximálna velkosť uploadovaného súboru je ".($velkost/1024)." kB<br>\n" ; } else $error = "Priložte obrázok.<br>"; if($error == "") { //samotný upload a resize... } ?> Dufam ze pomoze aj pre RaZeM. |
||
RaZeM Profil |
#13 · Zasláno: 21. 2. 2012, 23:03:25 · Upravil/a: RaZeM
ja mam taketo nieco uz
<?php $error = "Nepripojilo sa."; $connect = mysql_connect("localhost", "", "") or die($error); mysql_select_db("razem") or die($error); session_start(); $id = $_SESSION['id']; if (isset($_POST['submit'])) { $name = $_FILES['avatar']['name']; $tmp_name = $_FILES['avatar']['tmp_name']; $random_name=rand(0000000000,9999999999); $new_name=$random_name.$name; $imageinfo = getimagesize($_FILES['avatar']['tmp_name']); if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg' && $imageinfo['mime'] != 'image/png') { echo "<ul>Len obrázky typu PNG,GIF,JPG,JPEG</ul><br><div id='logo2'><img src='obrazky/blizzard.png' width='90px'/></div>\n"; exit; } if ($name) { $location = "avatar/".$new_name; move_uploaded_file($tmp_name,$location); $query = mysql_query("UPDATE uzivatelia SET imagelocation='$location' WHERE id='$id'"); echo "<SCRIPT>"; echo "window.location.href='index.php?clanok=profil'"; echo "</SCRIPT>"; } else die("Prosim vyber obrazok"); } ?> akurat este potrebujem nejak spravit SIZE to ARRAY a formaty ani to $_FILES["file"]["size"] som tma nevedel zadefinovat do toho mojho kodu |
||
martin1312 Profil |
#14 · Zasláno: 21. 2. 2012, 23:09:45
takze toto ti uz funguje?
array mi iba vytvorilo pole, aby som nemusel porovnavat kazdu moznost samostatne. Potom funkciou in_array() som overil, ci sa dané znaky nachadzaju v mojom poli. $_FILES["file"]["size"] vracia velkost nahrateho suboru ale v byteoch. V mojej ukazke kodu som zabudol na zaciatok uviest $velkost = 1048576; , cize mam povolenu velkost obrazku na max 1MB. |
||
RaZeM Profil |
#15 · Zasláno: 21. 2. 2012, 23:11:38
aha a vedel by si popisat ten moj kod za
1. ci to mozem nechat tak s tymi formatmi akoze PNG JPG atd 2. dal som nahodne meno vygenerovat obrazku aby sa neopakovali 3. vlozit nejak to size do mojho kodu? |
||
Keeehi Profil |
#16 · Zasláno: 21. 2. 2012, 23:14:20
martin1312:
Bezpečné to asi je, ale hezky to napsané není. RaZeM: Tvůj kód má bezpečnostní díru. |
||
RaZeM Profil |
#17 · Zasláno: 21. 2. 2012, 23:15:36
ak nejaku velku mozes pomoct nebudem proti :D
|
||
DoubleThink Profil * |
#18 · Zasláno: 21. 2. 2012, 23:16:42
RaZeM
Hodnotu $_FILES["file"]["type"] určuje prohlížeč. Ověřovat typ souboru podle ní není bezpečné ani spolehlivé - proč neověříš koncovku souboru? |
||
Keeehi Profil |
#19 · Zasláno: 21. 2. 2012, 23:19:25
RaZeM:
O tvém problému se píše pod upload3.php v článku odkazovaném martin1312. |
||
RaZeM Profil |
#20 · Zasláno: 21. 2. 2012, 23:20:37
Lebo som to skusal uz hociako ale stale mi to enchelo ist tak toto jedina moznost ako mi to ide .. neviem to tam nijak inak urobit
|
||
martin1312 Profil |
1. Teoreticky ano, ale do podmienky daj este image/pjpeg , pretoze ked budes uploadovat subor cez IE, tak ten bude vraciat format jpeg ako pjpeg.
2. vsimol som si to. Aj ked mas random nastaveny na velky pocet a v podstate riziko rovnakeho nazvu je minimalne, ja to praktizujem tak, ze zistim ci sa nazov suboru uz nenachadza medzi uploadovanymi obrazkami (keby nahodou) $zlozka = "upload_obr/"; //zlozka so vsetkymi obrazkami $rename = $_FILES["file"]["name"]; //overenie, ci uz existuje rovnaky nazov, ak ano premenujeme subor if(file_exists($zlozka.$rename)) { do{ $rename_cast = explode(".", $rename); //rozdelenie nazvu podla "." $rename = $rename_cast[0].rand(1,999).'.'.$rename_cast[1]; //zlozenie nazvu dokopy } while (file_exists($zlozka.$rename)); } Neviem, ci je to prave najidealnejsie, ale vyhovuje mi to. Funguje to tak, ze prepisuje "predponu" nazvu generovanu fciou rand() dovtedy, dokym existuje uz obrazok s rovnakym nazvom. Popripade je ešte pred tym dobre odstránit diakritiku a medzery z nazvu obrazku. EDIT: ej vidim ze ste ma uz predbehli :) Keeehi: jop to viem, ze to nie je prave najkrajsie. EDIT2: zabudol som este: 3. pridaj podmienku if($_FILES["file"]["size"] > 1048576) echo "Velky subor";
|
||
RaZeM Profil |
#22 · Zasláno: 21. 2. 2012, 23:35:24
idem skusit to s tym menom .... a ta podmienka na SIZE to som tma ksusal dat ale nic proste nvm ako to tam presne dat
|
||
Keeehi Profil |
Toto by měla být postačující, všeobjímající podmínka:
if(preg_match('~^[^\./\\\]+\.(jpg|jpeg|gif|png)$~i',$_FILES['avatar']['name']) == 1) // upload povolen else // upload zakázán |
||
RaZeM Profil |
#24 · Zasláno: 22. 2. 2012, 00:02:16
nejde mi to premenovanie podla hentoho :D ja to tam proste neviem vlozit :D
|
||
martin1312 Profil |
#25 · Zasláno: 22. 2. 2012, 00:10:50
RaZeM:
pracujes s databazou, a nevies vlozit pár riadkov kodu do svojho kodu? |
||
RaZeM Profil |
#26 · Zasláno: 22. 2. 2012, 00:12:29
ne proste mi to nejde :D
|
||
martin1312 Profil |
#27 · Zasláno: 22. 2. 2012, 00:16:20
Neviem, či s takýmto pristupom niečo dosiahneš.
Ľudia sa ti tu snažia poradiť, a ty jedine co napišeš, že to nejde...... Ked to nejde tak hladám príčinu, googlujem čo sa len da. Rozober si script na menšie častia tie skušaj osobitne, snaž sa hlavne TY. Ja nepotrebujem upload script, ty ho potrebuješ. |
||
RaZeM Profil |
#28 · Zasláno: 22. 2. 2012, 00:19:20
Ja sa s tym uz hram cele 2 dni a studujem jak spravim toho avatara nejsom z tyhc co nic neskusia .. osm to tam dal ale mi to nepremenuej vobec nahodne
|
||
DoubleThink Profil * |
#29 · Zasláno: 22. 2. 2012, 02:07:43
RaZeM:
Tak si zkus nejdřív nastudovat základy PHP. Jinak, zní to neuvěřitelně, ale nejste první, kdo potřeboval vygenerovat náhodný (a unikátní) název souboru. A tak existuje třeba funkce tempnam. |
||
RaZeM Profil |
#30 · Zasláno: 22. 2. 2012, 02:09:58
Jojo sak citam co to da :D sak sa snazim neico spravit aj
|
||
Téma pokračuje na další straně.
|
0