Загрузка изображений на сайт, безопасная и не глючная

Spear

почемучка
Загрузка изображений на сайт, безопасная и не глючная

Здравствуйте!
(сразу говорю - поиск использловал, но ничего не смог сделать).
У меня такая проблема - Вы немогли бы мне пожалуйста показать код правильной и безопасной загрузки изображений на сайт?
Я мучаюсь, блин, второй день..
либо не загружает, либо получается что загружает все что только можно :(

Мне просто нужен код, который разрешит загрудать только файлы gif, jpg, png, и будет защищен на 100% от загрузки всяких хакерских ревьюверов и прочих.
Немогли бы Вы, пожалуйста, показать как это провильно делается?
 

Spear

почемучка
вот код, который я взял с php.net
Очень Вас прошу, подскажите - возможно ли обойти его и загрузить вместо картинки что-то другое?
PHP:
<?
function uploader($num_of_uploads=1, $file_types_array=array("jpg","jpeg","png","gif"), $max_file_size=1048576, $upload_dir="i/companies/"){
  if(!is_numeric($max_file_size)){
   $max_file_size = 1048576;
  }
  if(!isset($_POST["submitted"])){
   $form = "<form action='".$PHP_SELF."' method='post' enctype='multipart/form-data'>Upload files:<br /><input type='hidden' name='submitted' value='TRUE' id='".time()."'><input type='hidden' name='MAX_FILE_SIZE' value='".$max_file_size."'>";
   for($x=0;$x<$num_of_uploads;$x++){
     $form .= "<input type='file' name='file[]'><font color='red'>*</font><br />";
   }
   $form .= "<input type='submit' value='Upload'><br /><font color='red'>*</font>Maximum file length (minus extension) is 15 characters. Anything over that will be cut to only 15 characters. Valid file type(s): ";
   for($x=0;$x<count($file_types_array);$x++){
     if($x<count($file_types_array)-1){
       $form .= $file_types_array[$x].", ";
     }else{
       $form .= $file_types_array[$x].".";
     }
   }
   $form .= "</form>";
   echo($form);
  }else{
   foreach($_FILES["file"]["error"] as $key => $value){
     if($_FILES["file"]["name"][$key]!=""){
       if($value==UPLOAD_ERR_OK){
         $origfilename = $_FILES["file"]["name"][$key];
         $filename = explode(".", $_FILES["file"]["name"][$key]);
         $filenameext = $filename[count($filename)-1];
         unset($filename[count($filename)-1]);
         $filename = implode(".", $filename);
         $filename = substr($filename, 0, 15).".".$filenameext;
         $file_ext_allow = FALSE;
         for($x=0;$x<count($file_types_array);$x++){
           if($filenameext==$file_types_array[$x]){
             $file_ext_allow = TRUE;
           }
         }
         if($file_ext_allow){
           if($_FILES["file"]["size"][$key]<$max_file_size){
             if(move_uploaded_file($_FILES["file"]["tmp_name"][$key], $upload_dir.$filename)){
               echo("File uploaded successfully. - <a href='".$upload_dir.$filename."' target='_blank'>".$filename."</a><br />");
             }else{
               echo($origfilename." was not successfully uploaded<br />");
             }
           }else{
             echo($origfilename." was too big, not uploaded<br />");
           }
         }else{
           echo($origfilename." had an invalid file extension, not uploaded<br />");
         }
       }else{
         echo($origfilename." was not successfully uploaded<br />");
       }
     }
   }
  }
}

switch($go) {
    default:
    uploader();
    break;

}
?>
и ещё - как переименовать файл во время загрузки? тоесть не его тип и именно имя? Очень прошу, подскажите.

-~{}~ 22.05.05 18:03:

неработает скрипт. белый экран. Все-таки лучше мне разобраться чем уже готовую кучу непонятных кодов использовать
 

~FisHBonE~

Guest
А не проще-ли сделать проверку расширений загружаемых файлов с помощью регулярных выражений, а потом (если проверка прошла успешно) при обращении к файл сделать проверку на истинность расширений при помощи стандартных фукций GD... Например getimagesize($filename) она возвращает формат изображения и размер...
 

Necromant

Новичок
вообще страдая параноей можно проверять первые 3 байта загруженого файла
 

Alex_v.tv

Новичок
Держи:
PHP:
$max_image_width = 600;
$max_image_height = 400;
$max_image_size = 64 * 1024;
$path = "../images/";
// определение параметров файла
if (!isset($HTTP_POST_FILES['userfile'])) exit;
if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'])) {
if ($HTTP_POST_FILES['userfile']['size']>$max_image_size)
{
 echo "Размер файла более ".$max_image_size." байт<br><br>";
exit;
}
$size = getImageSize($userfile);
$width= $size[0];
$height= $size[1];
if ($size[0] > $max_image_width)
{
echo "Ширина изображения более ".$max_image_width."<br><br>";
exit;
}
elseif ($size[1] > $max_image_height)
{
echo "Высота изображения более ".$max_image_height."<br><br>";
exit;
}
if (($HTTP_POST_FILES['userfile']['type']=="image/gif")|| ($HTTP_POST_FILES['userfile']['type']=="image/pjpeg")
|| ($HTTP_POST_FILES['userfile']['type']=="image/jpeg"))
{
if (file_exists($path . $HTTP_POST_FILES['userfile']['name']))
{
echo "Файл уже существует!<br>\n";
exit;
}
$s = $HTTP_POST_FILES['userfile']['size']/1024;
$s = round($s);
$date_img = date("dmY");
$date_ = date("d.m.Y");
//случайные числа от 0 до 999
$rand_1=rand(0,999);
// строка из случайного числа и даты
$xx = (string)$rand_1;
$str = (string)$date_img;
// выделение расширения файла
if (($HTTP_POST_FILES['userfile']['type']=="image/gif"))
$ext = "gif";
elseif (($HTTP_POST_FILES['userfile']['type']=="image/pjpeg"))
$ext = "jpg";
elseif (($HTTP_POST_FILES['userfile']['type']=="image/jpeg"))
$ext = "jpg";
//формирование нового имени файла
$ss = "_";
$dot = ".";
$new_name_file = $str."".$ss."".$data_array['auto_id']."".$ss."".$xx."".$dot."".$ext;
$first_name_file = $HTTP_POST_FILES['userfile']['name'];
$res = copy($HTTP_POST_FILES['userfile']['tmp_name'], $path.$new_name_file);
$full_path = $path."".$new_name_file;
if (!$res)
{
echo "Загрузка невозможна!<br>\n";
 exit;
творение полугодичной давности, работает без проблем, НО, советую разобраться сначала, что делает каждая конкретная функция.....

-~{}~ 23.05.05 18:14:

}
забыл добавить ))

-~{}~ 23.05.05 18:19:

вместо "$data_array['auto_id']" используй любое угодное название...

-~{}~ 23.05.05 18:30:

Не стоит запускать "как есть" - работать не будет!!!
Сначала разберись
 
Сверху