Безопасно ли сохранять загруженные файлы?

Я пытаюсь создать простой загрузчик изображений с использованием PHP. Я знаю, как его кодировать, однако у меня есть несколько проблем ..

У меня был следующий вопрос: безопасно ли сохранять файлы, которые пользователи отправляют, как исходный файл? Под этим я подразумеваю: не получу ли я никаких уязвимостей при сохранении файла, отправленного пользователем?

Допустим, мой PHP-скрипт делает это: он получает данные POST, которые включают в себя файл, отправленный человеком на моем веб-сайте. Можно ли просто переместить файл в каталог с оригинальным именем, содержимым и т. Д.? Есть ли вред в этом, или я должен переименовать эти файлы в случайную строку?

Если это не безопасный способ сделать это, тогда что? Как я могу убедиться, что отправляемый контент не вреден?

0

Решение

Всегда есть уязвимости в хранении и предоставлении контента, предоставленного клиентом.

В этом блоге дается хорошее описание уязвимостей, с которыми вы можете столкнуться, как они используются и как защититься от них. Я предлагаю вам использовать это как ссылку: http://blog.insicdesigns.com/2009/01/secure-file-upload-in-php-web-applications/

1

Другие решения

Убедитесь, что вы обрабатываете только файлы с правильным окончанием. Файлы изображений никогда не выполняются веб-сервером, но, например, файлы .php. Поэтому убедитесь, что пользователи не загружают файлы, которые могут быть выполнены.

Я не знаю имен файлов, которые вредны. Для содержания это сложно ответить. Я помню вектор атаки с модифицированными изображениями TIFF в Windows и один в libjpeg в * nix Systems. Однако вы, вероятно, не сможете найти эти вещи без полного декодирования изображения.

0

Вот другой подход: используйте это (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/)

0

Я бы сказал, что 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, который разрешит доступ только к файлам с
    разрешенные расширения.
  • Не помещайте файл .htaccess в тот же каталог, где находится
    загруженные файлы будут сохранены. Это должно быть размещено в родительском
    каталог.
  • Типичный .htaccess, который допускает только файлы gif, jpg, jpeg и png
    должно включать в себя следующее (адаптировать его для собственных нужд). Это будет
    также предотвратить двойные атаки расширения.

    deny from all
    <Files ~ “^w+.(gif|jpe?g|png)$”>
    order deny,allow
    allow from all
    </Files>

  • Если возможно, загрузите файлы в каталог за пределами корневого каталога сервера.
    Запретить перезапись существующих файлов (для предотвращения .htaccess
    перезаписать атаку).

Создайте список принятых типов пантомимы (расширения карты из этих типов пантомимы).
Создайте случайное имя файла и добавьте ранее созданное расширение.
Не полагайтесь только на проверку на стороне клиента, так как этого недостаточно. В идеале нужно реализовать проверку как на стороне сервера, так и на стороне клиента.

-1
По вопросам рекламы [email protected]