Проверка файла PHP - PullRequest
       29

Проверка файла PHP

1 голос
/ 14 февраля 2012

Я пишу функцию загрузки нескольких файлов для себя.

Проблема в том, что я буду загружать файлы .psd, .cdr, .indd, .cad и т. Д.

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

РЕДАКТИРОВАТЬ Вопрос не в том, чтобы проверить, является ли файлимеет расширение, такое как psd, cdr и т. д. Мне нужно иметь возможность проверить, является ли файл допустимым файлом PSD или CDR.

Ответы [ 5 ]

1 голос
/ 14 февраля 2012

Используйте функциональность FileInfo, чтобы получить реальный mimetype полученных файлов:

http://www.php.net/manual/en/intro.fileinfo.php

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

1 голос
/ 14 февраля 2012

Да и нет.

Извлечение расширения из имени файла является тривиальной строковой операцией.
Тестировать извлеченное расширение на массиве предопределенных расширений - тоже не ракетостроение.

Однако в некоторых случаях такая проверка может поставить под угрозу безопасность вашего сайта.
Если вы используете веб-сервер Apache, у него есть необычная привычка искать расширение файла среди нескольких.
Скажем, имя файла image.php.cad будет выполняться как скрипт PHP Apache с настройками по умолчанию.

, чтобы избежать такой опасности, либо вообще не используйте Apache, ищите .php по всему имени файла, либо настраивайте свой PHP таким образом

<FilesMatch \.php$>
  SetHandler php5-script
</FilesMatch> 

(предоставлено http://verens.com/2008/10/13/security-hole-for-files-with-a-dot-at-the-end/)

0 голосов
/ 14 февраля 2012

Я действительно не знаю команд php, которые предоставляют вам такую ​​точную информацию. Все упомянутое выше основано на расширении файла, которое может быть подделано.

Если ваш веб-сервер работает в системе * nix, вы можете использовать системную команду file

system("file $filePath");

Это надежно, потому что файл выглядит заголовком содержимого файла (расширение файла не влияет на результаты). Эта команда относится к двоичным файлам. Текстовые файлы, такие как sql, все ascii.

Если вы видите это как решение, взгляните на справочную страницу и проверьте опции file.

0 голосов
/ 14 февраля 2012

Вы можете использовать функцию pathinfo:

if ( pathinfo($_FILES['fileinput']['name'], PATHINFO_EXTENSION) == 'psd' ) {
    // do something...
}

Для проверки MIME-типа попробуйте использовать http://ru.php.net/manual/en/function.finfo-file.php

0 голосов
/ 14 февраля 2012
function endsWith($haystack, $needle)
{
    $length = strlen($needle);
    $start  = $length * -1; //negative
    return (substr($haystack, $start) === $needle);
}

if(!endWith($_FILES['file1']['name'],".psd") || !endWith(..)...){
   //Error! file extension not correct
}else{
    //correct!
}
...