Я пытаюсь создать простой загрузчик изображений с использованием PHP. Я знаю, как его кодировать, однако у меня есть несколько проблем ..
У меня был следующий вопрос: безопасно ли сохранять файлы, которые пользователи отправляют, как исходный файл? Под этим я подразумеваю: не получу ли я никаких уязвимостей при сохранении файла, отправленного пользователем?
Допустим, мой PHP-скрипт делает это: он получает данные POST, которые включают в себя файл, отправленный человеком на моем веб-сайте. Можно ли просто переместить файл в каталог с оригинальным именем, содержимым и т. Д.? Есть ли вред в этом, или я должен переименовать эти файлы в случайную строку?
Если это не безопасный способ сделать это, тогда что? Как я могу убедиться, что отправляемый контент не вреден?
Всегда есть уязвимости в хранении и предоставлении контента, предоставленного клиентом.
В этом блоге дается хорошее описание уязвимостей, с которыми вы можете столкнуться, как они используются и как защититься от них. Я предлагаю вам использовать это как ссылку: http://blog.insicdesigns.com/2009/01/secure-file-upload-in-php-web-applications/
Убедитесь, что вы обрабатываете только файлы с правильным окончанием. Файлы изображений никогда не выполняются веб-сервером, но, например, файлы .php. Поэтому убедитесь, что пользователи не загружают файлы, которые могут быть выполнены.
Я не знаю имен файлов, которые вредны. Для содержания это сложно ответить. Я помню вектор атаки с модифицированными изображениями TIFF в Windows и один в libjpeg в * nix Systems. Однако вы, вероятно, не сможете найти эти вещи без полного декодирования изображения.
Вот другой подход: используйте это (https://hacks.mozilla.org/2011/03/the-shortest-image-uploader-ever/) очень короткий Image Uploader от Paul Rouget на основе API Imgur.com.
Вместо загрузки непосредственно в вашу базу данных, позвольте imgur выполнить всю защиту и проверку, а затем, если вам нужно, создайте ссылку или загрузите (безопасное) изображение через Imgur.
Это бесплатно для некоммерческих и очень дешево для коммерческих.
В принципе, вы можете использовать API imgur для безопасной загрузки изображений с вашей HTML-страницы, без какого-либо кода на стороне сервера.
Вот живая демонстрация 🙁http://paulrouget.com/miniuploader/)
Я бы сказал, что 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
перезаписать атаку).
Создайте список принятых типов пантомимы (расширения карты из этих типов пантомимы).
Создайте случайное имя файла и добавьте ранее созданное расширение.
Не полагайтесь только на проверку на стороне клиента, так как этого недостаточно. В идеале нужно реализовать проверку как на стороне сервера, так и на стороне клиента.