Вопрос прост. Как я могу сделать 100% безопасный сценарий загрузки фотографий с помощью php? Есть ли учебные пособия, которые показывают все возможные пробелы в безопасности?
Не предлагайте мне посмотреть на этот вопрос , потому что там они говорят только о размере. Но я хочу быть уверенным, что никто не может загружать оболочку и другие вещи. Потому что это большой веб-сайт, который требует 100% безопасного сценария загрузки фотографий.
Изменить: или, может быть, я должен разрешить участникам загружать фотографии в сосуды, такие как imageshack, и копировать их ссылку на мой сайт? Наверное, это на 100% безопасно, не так ли?
Это довольно просто. Запускайте все загруженные изображения через фильтр изображений, который, как известно, безопасен. Если он отталкивает «Не ошибка изображения», у вас есть синонимы. (Простым примером может быть преобразование идентичности или метод нормализации качества JPEG.) Важным моментом является то, что на самом деле используется выход из фильтра, а не исходного файла.
Вещи, которые вам нужно учитывать и следить за:
Расширения файлов: веб-серверы используют расширение файла, чтобы определить MIME-тип, отправленный клиенту. Вы должны использовать белый список расширений, которые вы разрешаете. В вашем случае это будут расширения изображений.
LFI: Как уже упоминалось в Matchu, включение локального файла может быть проблемой. Если ваше приложение имеет динамические включения, которые позволяют включать произвольный файл, например. include($_GET['myfile']);
это может привести к произвольному выполнению PHP. Таким образом, вы должны обеспечить такие включения, используя basename () . Это может произойти с изображениями, поскольку они могут содержать встроенные комментарии.
MIME-Type-Detection: на самом деле это не очень хорошо известно, и информации об этом мало. IE <8 имеет функцию MIME-Type-Detection, которая, если Content-Type не соответствует содержанию, попытается угадать тип, посмотрев первые 256 байт. Это означает, что если у вас есть PNG-файл с именем image.gif с комментарием вверху, который читает <script>alert('hello');</script>
, тогда IE <8 будет думать, что это HTML и выполнить JavaScript, что приводит к атаке XSS.
Чтобы предотвратить эту проблему для изображений, вы можете использовать подход, упомянутый Williham Totland. Я бы предложил использовать getimagesize (), чтобы определить, является ли изображение действительным и гарантировать, что расширение соответствует типу.
$image_filename = 'uploaded_image.gif'; $image_extension = substr(strrchr($image_filename, '.'), 1); $mime_mapping = array('png' => 'image/png', 'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg'); $info = getimagesize($image_filename); if (!$info) { exit('not an image'); } if ($info['mime'] != $mime_mapping[$image_extension]) { exit('wrong extension given'); } // all checks passed // image can be saved now
Об этой проблеме написана статья.
Как вы упомянули, есть еще один вопрос, который решает эту проблему . Автор отмечает, что он должен быть в безопасности до тех пор, пока он принимает только оригинальные файлы изображений и сохраняет размер файла, что является единственной возможностью, которую вы можете сделать. Проверьте расширение и тип MIME и отклоните все, что не соответствует форматам, которые вы хотите. Там все еще RFI (ну, скорее, LFI здесь), но до тех пор, пока вы не беспорядочно включаете файлы без проверок проверки работоспособности, вам должно быть хорошо идти.