Загрузка PHP - Разрешить только файлы jpg

Это то, что у меня есть на данный момент:

$file_name = $HTTP_POST_FILES['uid']['name'];
$user= 'FILENAME';
$ext = pathinfo($file_name, PATHINFO_EXTENSION);
$new_file_name=$user . '.' . $ext;
$path= "uploads/images/users/".$new_file_name;
if($ufile !=none)
{
  if(copy($HTTP_POST_FILES['uid']['tmp_name'], $path))
  {
  echo "Successful<BR/>"; 
  echo "File Name :".$new_file_name."<BR/>"; 
  echo "File Size :".$HTTP_POST_FILES['uid']['size']."<BR/>"; 
  echo "File Type :".$HTTP_POST_FILES['uid']['type']."<BR/>"; 
  }
  else
  {
  echo "Error";
  }
}

person Sean    schedule 28.02.2011    source источник
comment
Вы можете использовать метод getimagesize(), показанный в вашем другом вопросе.   -  person Pekka    schedule 28.02.2011
comment
Это не лучший способ задать вопрос. В чем дело? В чем вам нужна помощь, делает ли приведенный выше код то, что вы ожидаете?   -  person diagonalbatman    schedule 28.02.2011
comment
К вашему сведению, HTTP_POST_FILES устарело на лет; вместо этого используйте $_FILES, если вы не вынуждены разрабатывать для PHP4 (кто-нибудь все еще делает это?)   -  person Piskvor left the building    schedule 28.02.2011
comment
Также не используйте copy() для обработки загруженных файлов. В PHP специально для этой цели есть move_uploaded_file(), в котором есть несколько дополнительных проверок для предотвращения атак на загруженный файл со стороны сервера.   -  person Marc B    schedule 28.02.2011


Ответы (2)


<?php

$allowedTypes = array('image/jpeg');

$fileType = $HTTP_POST_FILES['uid']['type'];

if(!in_array($fileType, $allowedTypes)) {
    // do whatever you need to say that
    // it is an invalid type eg:
    die('You may only upload jpeg images');
}

?> 

надеюсь это поможет. Также почему вы используете HTTP_POST_FILES вместо $_FILES? Вы работаете со старой версией PHP?

person Simon H    schedule 28.02.2011
comment
Стоит отметить, что этот метод основан на данных о типе контента, отправляемых браузером, и им можно манипулировать. Использование getimagesize() было бы лучше - person Pekka; 28.02.2011
comment
Теперь я отказался от использования копирования и HTTP_POST_FILES, но все еще не уверен, как разрешить только jpg - все, что я пробовал, дает ошибку, но по-прежнему ничего не загружает или не загружает, включая файлы jpg - person Sean; 28.02.2011
comment
безопасно ли это при загрузке php-скриптов в RCE? - person evandrix; 21.05.2015

Никогда не верьте тому, что происходит. Это небезопасно и потенциально может привести к тому, что люди испортят ваш сервер. Попробуйте вместо этого http://ar.php.net/imagecreatefromjpeg

<?php
function LoadJpeg($imgname){
    /* Attempt to open */
    $im = @imagecreatefromjpeg($imgname);

    if(!$im){ 
       throw new InvalidArgumentException("$imgname is not a JPEG image");
    }  

    return $im;
}
?>

Используя это так:

$uploadDir = "/path/to/uploads/directory";
$handle = LoadJpeg($_FILES['uid']['tmp_name']);
imagejpeg($handle, $uploadDir.DIRECTORY_SEPARATOR.$_FILES['uid']['name']);
person Carlos Vergara    schedule 28.02.2011
comment
Теперь я отказался от использования копирования и HTTP_POST_FILES, но все еще не уверен, как разрешить только jpg - все, что я пробовал, дает ошибку, но по-прежнему ничего не загружает или не загружает, включая файлы jpg. - person Sean; 28.02.2011
comment
Это позволит эффективно избежать использования любых файлов, которые не являются файлами JPEG, но если вы хотите, чтобы фактическая загрузка завершилась на полпути, то, вероятно, вам нужно выполнить загрузку с помощью флэш-памяти. - person Carlos Vergara; 28.02.2011