Я создаю сценарий загрузки файлов, и я ищу лучшие методы и методы для проверки загруженных файлов.
Разрешенные расширения:
$allowed_extensions = array('gif','jpg','png','swf','doc','docx','pdf','zip','rar','rtf','psd');
Вот список того, что я делаю.
Проверка расширения файла
$path_info = pathinfo($filename); if( !in_array($path_info['extension'], $allowed_extensions) ) { die('File #'.$i.': Incorrent file extension.'); }
Проверка типа файла mime
$allowed_mimes = array('image/jpeg','image/png','image/gif','text/richtext','multipart/x-zip','application/x-shockwave-flash','application/msword','application/pdf','application/x-rar-compressed','image/vnd.adobe.photoshop'); if( !in_array(finfo_file($finfo, $file), $allowed_mimes) ) { die('File #'.$i.': Incorrent mime type.'); }
Проверка размера файла.
Что делать, чтобы загруженные файлы были действительными? Я заметил странную вещь. Я изменил .jpg расширение файла на .zip и … он был загружен. Я думал, что у него будет неправильный тип MIME, но после этого я заметил, что не проверяю определенный тип, но если в массиве существует определенный тип MIME. Я исправлю это позже, это не создает проблем для меня (конечно, если у вас есть хорошее решение / идея, не стесняйтесь поделиться им, пожалуйста).
Я знаю, что делать с изображениями (попробуйте изменить размер, повернуть, обрезать и т. Д.), Но не знаю, как проверить другие расширения.
Сейчас настало время для моих вопросов.
Я попытался загрузить файл .psd, который показал мне (image / vnd.adobe.photoshop). Я немного смущен этим. У файлов всегда есть один и тот же тип MIME?
Кроме того, я не могу заставить блок кода работать. Кто-нибудь догадывается, почему?
В большинстве форматов файлов имеется довольно стандартный набор начальных байтов для указания формата. Если вы делаете двоичное чтение для первых нескольких байтов и проверяете их на стартовые байты известных форматов, это должен быть довольно надежный способ подтвердить тип файла, соответствующий расширению.
Например, стартовые байты JPEG – 0xFF, 0xD8; так что-то вроде:
$fp = fopen("filename.jpg", "rb"); $startbytes = fread($fp, 8); $chunked = str_split($startbytes,1); if ($chunked[0] == 0xFF && $chunked[1] == 0xD8){ $exts[] = "jpg"; $exts[] = "jpeg"; }
а затем проверить на exts.
может работать.
Если вы хотите проверить изображения, хорошо сделать это, используйте getimagesize () и посмотрите, вернет ли он допустимый набор размеров – или ошибки, если это недопустимый файл изображения. Или используйте аналогичную функцию для файлов, которые вы пытаетесь поддерживать.
Ключ в том, что имя файла означает абсолютно ничего . Расширения файлов (.jpg и т. Д.), Типы mime … предназначены для людей.
Единственный способ гарантировать, что файл имеет правильный тип, – это открыть его и оценить его байтом по байту. Это, очевидно, довольно сложная задача, если вы хотите попытаться проверить большое количество типов файлов. На простейшем уровне вы можете посмотреть первые несколько байтов файла, чтобы убедиться, что они соответствуют ожидаемому файлу такого типа.