« 1 2 »
Autor Zpráva
RaZeM
Profil
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
Nejčastější potíže s PHP (FAQ) » Upload souborů
RaZeM
Profil
Tak z toho som trocha sprosty to sem neviem dosadit tu ochranu
martin1312
Profil
ked som robil ja upload obrazkov, ochranu som riesil podla tohto http://blackhole.sk/topicupload-suborov-v-php-nebezpecne-gif-obrazky .
RaZeM
Profil
Skusam to nejak dopnit do toho mojho kodu ale nebere to stale
martin1312
Profil
RaZeM:
nieco taketo ($_FILES["file"]["type"] == "image/jpeg") hociakym s

nezabudas na to, ze tvoj input sa vola 'avatar' ?
RaZeM
Profil
to viem to som aj zmenil
martin1312
Profil
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
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
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
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
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
martin1312:
Bezpečné to asi je, ale hezky to napsané není.

RaZeM:
Tvůj kód má bezpečnostní díru.
RaZeM
Profil
ak nejaku velku mozes pomoct nebudem proti :D
DoubleThink
Profil *
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
RaZeM:
O tvém problému se píše pod upload3.php v článku odkazovaném martin1312.
RaZeM
Profil
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
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
Kontroluje se koncovka oproti whitelistu a před .xxx již není dovolena jiná tečka nebo lomítko. To udrží jak soubor v adresáři, tak to znemožní nahrátí souborů jako je .htaccess
RaZeM
Profil
nejde mi to premenovanie podla hentoho :D ja to tam proste neviem vlozit :D
martin1312
Profil
RaZeM:
pracujes s databazou, a nevies vlozit pár riadkov kodu do svojho kodu?
RaZeM
Profil
ne proste mi to nejde :D
martin1312
Profil
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
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 *
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
Jojo sak citam co to da :D sak sa snazim neico spravit aj
« 1 2 »

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:

0