2013-02-15 6 views
-1

Я использую расширение файла для проверки файла загрузки, например, word excel pdf и т. Д.?PHP для загрузки файлов

Но если пользователь изменит расширение своего файла, он сможет загрузить любой файл, который им нужен.

Я хочу, чтобы этот тип проверки проверялся, если пользователь изменил расширение своего файла, после чего не смог загрузить файл.

Может ли один помочь

+1

Что вы должны знать о безопасности загрузки файлов: [прочитать это (PDF)] (http://www.net-security.org/dl/articles/php-file-upload.pdf) –

+0

Какие загрузки вы ожидаете? Изображения или что-нибудь еще? –

+0

Возможный дубликат [Угрозы безопасности с загрузками] (http://stackoverflow.com/questions/11061355/security-threats-with-uploads) и [Как получить тип содержимого файла в PHP?] (Http: //stackoverflow.com/questions/1232769/how-to-get-the-content-type-of-a-file-in-php) – deceze

ответ

1

Вы должны также проверить Mimetypes, например:

$allowedMimes = array('image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/bmp', 'image/wbmp'); 

//getting the mime type (it can be different from the extension) Be careful! 
$imgInfo = getimagesize(imagePath); 
$type = strtolower($imgInfo['mime']); 

//hey dude!! This is a fake image!! 
if(!in_array($type, $allowedMimes)){ 
    //We delete it!! 
    unlink(imagePath); 
}else{ 
    //do whatever with the image... 
} 

Вы можете найти более подробную информацию о типах мим here.

+0

Что происходит с 'fopen()'? Кроме того, просто использование 'getimagesize()' не будет защищать от jpeg masqueraded scripts, например. –

+0

Я удалил fopen. Не нужно было жаль :) – Alvaro

1

Чтобы обезопасить

Переместить все файлы независимо от типа из вебсервера.

  • Dont обеспечивает прямой доступ к файлу, используйте загрузчик для отправки файла пользователя, если у вас есть возможность скачать.
  • Force загрузки

Есть сценарий, download.php или любой другой, получить идентификатор файла, проверьте, кто вошел в систему, и если все проверки, извлечь файл, прочитать его в браузере, и отправить соответствующие заголовки загрузки.

header('Content-type: application/octet-stream'); 
header('Content-disposition: attachment; filename=file.ext'); 
header("Content-Length: " . filesize('../not_in_web_root/file.ext')); 
header("Content-Transfer-Encoding: binary"); 
readfile('../not_in_web_root/file.ext'); 
exit; 
  • только принимать файлы, которые вы хотите принять, проверяя расширение и MimeType, где это возможно. Его даже нормально даже принимать php, если вы не разрешаете ему выполнять или предоставить пользователю прямой доступ к нему.

Если только позволяет изображения затем использовать функцию как getimagesize(), если она имеет размер Сво изображения, но до сих пор не обеспечивают прямой доступ к нему, как PHP может быть встроен в него.

Если вы предлагаете пользователям файловую систему, сделайте ее виртуальной, основанной на значениях в базе данных, не имеющих доступа к реальным файлам.

Смежные вопросы