Intereting Posts
Заполнение объекта из массива данных без формы / запроса Как мне зашифровать этот пароль с помощью MD5 с помощью PHP? php parse_url reverse – проанализированный URL-адрес Как отлаживать «Неустранимая ошибка: вне памяти (выделено XXX) (пытался выделить XXXXX байты)»? Перенаправление пользователя на мой сайт на странице холста Facebook Многопоточная вставка PHP и MySQLi – Ошибка Twig templates engine: получить текущий url Ошибка SOAP-сервера в PHP – добавление функций из класса PHP: Какова сложность (т. Е. O (1), O (n)] функции «count»? Как удалить переменную из массива сеансов PHP я хочу остаться в том же модальном диалоговом окне после того, как я нажму «Отправить» Как проверить Apostrophe с предложением where с использованием mysql Yii: Добавить JavaScript в заголовок PHP date () и strtotime () возвращают неправильные месяцы 31-го MP4 воспроизводится при доступе напрямую, но не при чтении через PHP, на iOS

100% безопасный сценарий загрузки фотографий

Вопрос прост. Как я могу сделать 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 здесь), но до тех пор, пока вы не беспорядочно включаете файлы без проверок проверки работоспособности, вам должно быть хорошо идти.