Я пытаюсь создать простой загрузчик изображений с помощью PHP. Я знаю, как его кодировать, однако у меня есть несколько проблем.
Мой вопрос, который у меня был, заключается в следующем: Сохраняет ли файлы, которые пользователи отправляют безопасно для сохранения в качестве исходного файла? С этим я имею в виду: не будет ли я получать какие-либо уязвимости при сохранении отправки файла пользователем?
Скажем, мой PHP-скрипт делает это: он извлекает данные POST, который включает в себя файл, отправленный человеком на моем веб-сайте. Сохраняется ли просто перенос файла в каталог с оригинальным именем, контентом и т.д.? Есть ли вред в этом, или я должен переименовать эти файлы в случайную строку?
Если это не безопасный способ сделать это, то что? Как я могу проверить, что отправляемый контент не является вредным?
Всегда есть уязвимости в хранении и предоставлении контента, предоставляемого клиентом.
Это сообщение в блоге дает хорошее описание уязвимостей, с которыми вы можете столкнуться, как они используются и как их защищать. Я предлагаю вам использовать это как ссылку: http://blog.insicdesigns.com/2009/01/secure-file-upload-in-php-web-applications/
Вот еще один подход: используйте этот (https://hacks.mozilla.org/2011/03/the-shortest-image-uploader-ever/) очень короткий Image Uploader, Пол Руже, на основе API Imgur.com.
Вместо того, чтобы загружать непосредственно в вашу базу данных, пусть imgur сделает всю безопасность и проверку, а затем, если вам нужно, связать или загрузить (безопасное) изображение через Imgur.
Он бесплатный для некоммерческих и очень дешевых для коммерческих.
В принципе, вы можете использовать imgur API для безопасной загрузки изображений со своей HTML-страницы без какого-либо кода на стороне сервера
Вот живая демонстрация: (http://paulrouget.com/miniuploader/)
Убедитесь, что вы обрабатываете только файлы с правильным окончанием. Файлы изображений никогда не выполняются веб-сервером, но, например, файлы.php. Поэтому убедитесь, что пользователи не загружают файлы, которые могут быть выполнены.
Мне неизвестны имена файлов, которые являются вредными. Для контента это трудно ответить. Я помню вектор атаки с измененными изображениями TIFF на окнах и один в libjpeg on * nix Systems. Однако вы, вероятно, не сможете найти эти вещи без полного декодирования изображения.
Я бы сказал, что 100% загружаемый файл пользователя не является 100% БЕЗОПАСНЫМ
Файлы JPEG могут содержать произвольные данные в них в дополнение к фактическим данным изображения; это часть спецификации. Таким образом, просто проверка того, является ли изображение допустимым JPEG, не означает, что файл обязательно полностью безопасен.
HTML Form:
<form enctype="multipart/form-data" action="uploader.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> Choose a file to upload: <input name="uploadedfile" type="file" /><br /> <input type="submit" value="Upload File" /> </form>
PHP Code:
<?php
$target_path = "uploads/";
$target_path = $target_path . basename($_FILES['uploadedfile']['name']);
if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
echo "The file " . basename($_FILES['uploadedfile']['name']) . " has been uploaded";
} else {
echo "There was an error uploading the file, please try again!";
}
?>
Типичный.htaccess, который позволяет только gif, jpg, jpeg и png файлы включать следующее (адаптировать его для вашей собственной потребности). Это также предотвратит атаки двойного расширения.
deny from all <Files ~ "^w+.(gif|jpe?g|png)$"> order deny,allow allow from all </Files>
Если возможно, загрузите файлы в каталог за пределами корня сервера. Предотвратите перезапись существующих файлов (чтобы предотвратить перезапись.htaccess).
Создайте список принятых mime-типов (расширения карт из этих типов mime). Создайте случайное имя файла и добавьте ранее сгенерированное расширение. Не полагайтесь только на проверку на стороне клиента, поскольку этого недостаточно. В идеале должны быть реализованы как проверки на стороне сервера, так и на стороне клиента.