Предотвратяване на качване на изображения с код

Jurassic

Registered
Здравейте, имам следния въпрос. Как да предотвратя качването на изображения с вграден текст в тях? Ето кода:

Код:
                //CHECK IF VALID IMAGE TYPE

                if (( ($_FILES[$name]["type"] == "image/gif")

                   || ($_FILES[$name]["type"] == "image/jpeg")

                   || ($_FILES[$name]["type"] == "image/pjpeg")

                   || ($_FILES[$name]["type"] == "image/x-png")

                   || ($_FILES[$name]["type"] == "image/png")))

                {



                $size = intval(($_FILES[$name]["size"] / 1024) / 1024);

                 

                 if ($session == true) 

                    $limit = $maxsizemember;

                 else

                    $limit = $maxsizeguest;  

 

                   if ($size > $limit)

                       die ("Файлът трябва да бъде по-малък от $limit Mb.");





                   if ($_FILES[$name]["error"] > 0)  {

                       die("Error: " . $_FILES[$name]["error"]);

                   }

                   else {

                       $n = $_FILES[$name]["name"];

                       $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);

                       $uploadPath = "pictures/" . $rndName;

                       $tempPath = $_FILES[$name]["tmp_name"];

                       move_uploaded_file($tempPath, $uploadPath);

                   }



                }

                else

                   die("Файлът \"{$_FILES[$name]["name"]}\" не е разпознат, като изображение!");
 
Ето така би трябвало да стане, изпробвай го :?:

Код:
/CHECK IF VALID IMAGE TYPE

                if (( ($_FILES[$name]["type"] == "image/gif")

                   || ($_FILES[$name]["type"] == "image/jpeg")

                   || ($_FILES[$name]["type"] == "image/pjpeg")

                   || ($_FILES[$name]["type"] == "image/x-png")

                   || ($_FILES[$name]["type"] == "image/png")))

                {



                $size = intval(($_FILES[$name]["size"] / 1024) / 1024);

                 

                 if ($session == true)

                    $limit = $maxsizemember;

                 else

                    $limit = $maxsizeguest; 

 

                   if ($size > $limit)

                       die ("Файлът трябва да бъде по-малък от $limit Mb.");


                   $open=file_get_contents($_FILES[$name]['tmp_name']);
                   $search=preg_match("/[\<\?][\<\?php]+/", $open);
                   if ($search)
                   {
                   echo "В файла има вграден кода !";
				   exit;
                   }
                   else
                   {


                   if ($_FILES[$name]["error"] > 0)  {

                       die("Error: " . $_FILES[$name]["error"]);

                   }

                   else {

                       $n = $_FILES[$name]["name"];

                       $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);

                       $uploadPath = "pictures/" . $rndName;

                       $tempPath = $_FILES[$name]["tmp_name"];

                       move_uploaded_file($tempPath, $uploadPath);
                        
						}
                   }



                }
				

                else

                   die("Файлът \"{$_FILES[$name]["name"]}\" не е разпознат, като изображение!"); }
 
Aми при тази модификация при всеки опит за ъплоуд на картинка изписва, че има вграден код :(
 
Пробвай така

Код:
	//CHECK IF VALID IMAGE TYPE

                if (( ($_FILES[$name]["type"] == "image/gif")

                   || ($_FILES[$name]["type"] == "image/jpeg")

                   || ($_FILES[$name]["type"] == "image/pjpeg")

                   || ($_FILES[$name]["type"] == "image/x-png")

                   || ($_FILES[$name]["type"] == "image/png")))

                {



                $size = intval(($_FILES[$name]["size"] / 1024) / 1024);

                 

                 if ($session == true)

                    $limit = $maxsizemember;

                 else

                    $limit = $maxsizeguest;

 

                   if ($size > $limit)

                       die ("Файлът трябва да бъде по-малък от $limit Mb.");


                   $open=file_get_contents($_FILES[$name]['tmp_name']);
                   $search=preg_match("/\<\?/", $open);
                   if ($search)
                   {
                   echo "В файла има вграден кода !";
               exit;
                   }
                   else
                   {


                   if ($_FILES[$name]["error"] > 0)  {

                       die("Error: " . $_FILES[$name]["error"]);

                   }

                   else {

                       $n = $_FILES[$name]["name"];

                       $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);

                       $uploadPath = "pictures/" . $rndName;

                       $tempPath = $_FILES[$name]["tmp_name"];

                       move_uploaded_file($tempPath, $uploadPath);
                       
                  }
                   }



                }
            

                else

                   die("Файлът \"{$_FILES[$name]["name"]}\" не е разпознат, като изображение!"); }
 
Ами например, слагаш в notepad-а някакъв текс, записваш го в .jpg и тази "картинка" може да се качи, а аз искам да се предотврати това.
 
Код:
if (( ($_FILES[$name]["type"] != "image/gif")

                   && ($_FILES[$name]["type"] != "image/jpeg")

                   && ($_FILES[$name]["type"] != "image/pjpeg")

                   && ($_FILES[$name]["type"] != "image/x-png")

                   && ($_FILES[$name]["type"] != "image/png")))

                {
die("Файлът \"{$_FILES[$name]["name"]}\" не е разпознат, като изображение!"); }else{

                $size = intval(($_FILES[$name]["size"] / 1024) / 1024);

                 

                 if ($session == true)

                    $limit = $maxsizemember;

                 else

                    $limit = $maxsizeguest; 

 

                   if ($size > $limit)

                       die ("Файлът трябва да бъде по-малък от $limit Mb.");





                   if ($_FILES[$name]["error"] > 0)  {

                       die("Error: " . $_FILES[$name]["error"]);

                   }

                   else {

                       $n = $_FILES[$name]["name"];

                       $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);

                       $uploadPath = "pictures/" . $rndName;

                       $tempPath = $_FILES[$name]["tmp_name"];

                       move_uploaded_file($tempPath, $uploadPath);

                   }}


ето това е решението :)
 
bogdan4o каза:
Код:
if (( ($_FILES[$name]["type"] != "image/gif")

                   && ($_FILES[$name]["type"] != "image/jpeg")

                   && ($_FILES[$name]["type"] != "image/pjpeg")

                   && ($_FILES[$name]["type"] != "image/x-png")

                   && ($_FILES[$name]["type"] != "image/png")))

                {
die("Файлът "{$_FILES[$name]["name"]}" не е разпознат, като изображение!"); }else{

                $size = intval(($_FILES[$name]["size"] / 1024) / 1024);

                 

                 if ($session == true)

                    $limit = $maxsizemember;

                 else

                    $limit = $maxsizeguest; 

 

                   if ($size > $limit)

                       die ("Файлът трябва да бъде по-малък от $limit Mb.");





                   if ($_FILES[$name]["error"] > 0)  {

                       die("Error: " . $_FILES[$name]["error"]);

                   }

                   else {

                       $n = $_FILES[$name]["name"];

                       $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);

                       $uploadPath = "pictures/" . $rndName;

                       $tempPath = $_FILES[$name]["tmp_name"];

                       move_uploaded_file($tempPath, $uploadPath);

                   }}


ето това е решението :)

Или толкова си схванал това, което иска потребителят, или толкова знаеш, КАРТИНКА .jpg, .png или каквато и да е било картинка, възможно е да с вгради php код в нея, и с спецялен скрипт, качен на сървъра, това може да се окаже фатален, това което ти му даваш е нищо повече от проверка на фйал формата, а то си я има, просто си променлива положението на проверката .. забележи в кода, който аз му давам, че отварям файла, който се качва, чета кода и проверявам за стрингове от сорта на <?, ако има, то значин има вграден код, ако ли не .. няма проблем :?:
 
Човек незнам, но първият варянт, който ти дадох работи 100%, пробвам си го на мой код .. и всичко е ОК .. но все пак ето пробвай така

Код:
//CHECK IF VALID IMAGE TYPE

                if (( ($_FILES[$name]["type"] == "image/gif")

                   || ($_FILES[$name]["type"] == "image/jpeg")

                   || ($_FILES[$name]["type"] == "image/pjpeg")

                   || ($_FILES[$name]["type"] == "image/x-png")

                   || ($_FILES[$name]["type"] == "image/png")))

                {



                $size = intval(($_FILES[$name]["size"] / 1024) / 1024);

                 

                 if ($session == true)

                    $limit = $maxsizemember;

                 else

                    $limit = $maxsizeguest;

 

                   if ($size > $limit)

                       die ("Файлът трябва да бъде по-малък от $limit Mb.");


                   $open=file_get_contents($_FILES[$name]['tmp_name']);
                   $search=preg_match("/[\<\?]/", $open);
                   if ($search)
                   {
                   echo "В файла има вграден кода !";
                   exit;
                   }
                   else
                   {


                   if ($_FILES[$name]["error"] > 0)  {

                       die("Error: " . $_FILES[$name]["error"]);

                   }

                   else {

                       $n = $_FILES[$name]["name"];

                       $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);

                       $uploadPath = "pictures/" . $rndName;

                       $tempPath = $_FILES[$name]["tmp_name"];

                       move_uploaded_file($tempPath, $uploadPath);
                       
                  }
                   }



                }
           

                else

                   die("Файлът $_FILES[$name][$name] не е разпознат, като изображение!"); }
 
Код:
                if (( ($_FILES[$name]["type"] == "image/gif")

                   || ($_FILES[$name]["type"] == "image/jpeg")

                   || ($_FILES[$name]["type"] == "image/pjpeg")

                   || ($_FILES[$name]["type"] == "image/x-png")

                   || ($_FILES[$name]["type"] == "image/png")))

                {



                $size = intval(($_FILES[$name]["size"] / 1024) / 1024);

                 

                 if ($session == true){

                    $limit = $maxsizemember;}

                 else{

                    $limit = $maxsizeguest;}

 

                   if ($size > $limit){

                       die ("Файлът трябва да бъде по-малък от $limit Mb.");}
                   $checkkkk = 1280;
                   if($size < $checkkkk){
                      die ("Качихте php код!.");}



                   if ($_FILES[$name]["error"] > 0)  {

                       die("Error: " . $_FILES[$name]["error"]);

                   }

                   else {

                       $n = $_FILES[$name]["name"];

                       $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);

                       $uploadPath = "pictures/" . $rndName;

                       $tempPath = $_FILES[$name]["tmp_name"];

                       move_uploaded_file($tempPath, $uploadPath);

                   }



                }

                else

                   die("Файлът \"{$_FILES[$name]["name"]}\" не е разпознат, като изображение!");
така ?

или така? :
Код:
 //CHECK IF VALID IMAGE TYPE

                if (( ($_FILES[$name]["type"] == "image/gif")

                   || ($_FILES[$name]["type"] == "image/jpeg")

                   || ($_FILES[$name]["type"] == "image/pjpeg")

                   || ($_FILES[$name]["type"] == "image/x-png")

                   || ($_FILES[$name]["type"] == "image/png")))

                {



                $size = intval(($_FILES[$name]["size"] / 1024) / 1024);

                 

                 if ($session == true){

                    $limit = $maxsizemember;}

                 else{

                    $limit = $maxsizeguest;}

 

                   if ($size > $limit){

                       die ("Файлът трябва да бъде по-малък от $limit Mb.");}


                   $open=file_get_contents($_FILES[$name]['tmp_name']);
                   $search=preg_match("/[\<\?]/", $open);
                   if ($search)
                   {
                   echo "Файлът не е снимка!";
                   exit;
                   }
                   else
                   {


                   if ($_FILES[$name]["error"] > 0)  {

                       die("Error: " . $_FILES[$name]["error"]);

                   }

                   else {

                       $n = $_FILES[$name]["name"];

                       $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);

                       $uploadPath = "pictures/" . $rndName;

                       $tempPath = $_FILES[$name]["tmp_name"];

                       move_uploaded_file($tempPath, $uploadPath);
                       
                  }
                   }



                }
           

                else

                   die("Файлът $_FILES[$name][$name] не е разпознат, като изображение!"); }
 
@bogdan4o ти изобщо знаеш ли какво правиш ? Ако ми обясниш как по това, колко е голям файла ще разбереш дали има вграден код ще ти дам 100 лева :lol: Моля те почети малко, и тогава се мъчи да помагаш :)
 
Направих малка промяна по кода на @kulov като добавих една функция.

Тествах няколко вариянта и работи.
Код:
FORM

<form action="upload.php" method="post" enctype="multipart/form-data">
  Send these files:<br />
  <input name="file" type="file" /><br />
  <input type="submit" value="Send files" name="uploadPhoto" />
</form>


Код:
UPLOAD.PHP

 <?php
  function findExtension($filename)
{
    $path_info = pathinfo($filename);
    return $path_info['extension'];
}

 	    //CHECK IF VALID IMAGE TYPE

                if (( ($_FILES["file"]["type"] == "image/gif")

                   || ($_FILES["file"]["type"] == "image/jpeg")

                   || ($_FILES["file"]["type"] == "image/pjpeg")

                   || ($_FILES["file"]["type"] == "image/x-png")

                   || ($_FILES["file"]["type"] == "image/png")))

                {



                $size = intval(($_FILES["file"]["size"] / 1024) / 1024);



                 if ($session == true)

                    $limit = $maxsizemember;

                 else

                    $limit = $maxsizeguest;



                   if ($size > $limit)

                       die ("Файлът трябва да бъде по-малък от $limit Mb.");


                   $open=file_get_contents($_FILES["file"]['tmp_name']);
                   $search=preg_match("/\<\?/", $open);
                   if ($search)
                   {
                   echo "В файла има вграден кода !";
               exit;
                   }
                   else
                   {


                   if ($_FILES["file"]["error"] > 0)  {

                       die("Error: " . $_FILES["file"]["error"]);

                   }

                   else {

                       $n = $_FILES["file"]["name"];

                       $rndName = md5($n . date("d-m-y") . time()) . "." . findExtension($n);

                       $uploadPath = "upload/" . $rndName;

                       $tempPath = $_FILES["file"]["tmp_name"];

                       move_uploaded_file($tempPath, $uploadPath);

                  }
                   }



                }


                else
                   {
                   die("Файлът \"{$_FILES["file"]["name"]}\" не е разпознат, като изображение!"); }
?>
 
а аз да задам един въпрос някой случайно да се е замислял че някой картинки съдържат и < ? и за това проверката показва че има вграден код
аз пробвах да кача почти 10 различни картинки формати jpg gif и png но само някой качва на останалите изписва че има вграден код :) но дали е така
 
bankera1990 каза:
а аз да задам един въпрос някой случайно да се е замислял че някой картинки съдържат и < ? и за това проверката показва че има вграден код
аз пробвах да кача почти 10 различни картинки формати jpg gif и png но само някой качва на останалите изписва че има вграден код :) но дали е така

Не говорим за < ? а за "<?"
Ако когато скрипта отвори файла ( снимката / картинката ) и намери "<?" той ще откаже качването му на сървъра.

Аз си поиграх и си направих тука за няколко часа доста интересна upload системка + thumb за сайта ми. До момента съм изпробвал сигурно над 50 различни снимки от гугъл и всичко работи перфектно.
Пробвах един файл който е с формат на Jpeg а в него има php - засича си го без проблем, за разлика от basic системите в нета.
 

Back
Горе