Как защитить папку, в которой пользователи могут загружать файлы?

StackOverflow https://stackoverflow.com/questions/22519

Вопрос

У меня на веб-сервере есть папка, используемая пользователями для загрузки фотографий с помощью страницы ASP.

Достаточно ли безопасно предоставить IUSR права на запись в папку?Должен ли я обеспечить что-то еще?Я боюсь, что хакеры обойдут страницу ASP и загрузят контент прямо в папку.

Я использую классический ASP и IIS6 на Windows 2003 Server.Загрузка осуществляется через HTTP, а не FTP.

Редактировать:Изменение вопроса для ясности и изменение моих ответов в виде комментариев.

Это было полезно?

Решение

Кроме того, я бы рекомендовал не разрешать пользователям загружать файлы в папку, доступную из Интернета.Даже самое лучшее определение типа MIME может дать сбой, и вы абсолютно не хотите, чтобы пользователи загружали, скажем, исполняемый файл, замаскированный под jpeg, в случае, если ваш анализ MIME не удался, но файл в IIS работает правильно.

В мире PHP ситуация еще хуже, поскольку злоумышленник может загрузить вредоносный PHP-скрипт, а затем получить к нему доступ через веб-сервер.

Всегда храните загруженные файлы в каталоге где-то за пределами корня документа и получайте к ним доступ с помощью какого-либо сценария доступа, который выполняет дополнительную очистку (и, по крайней мере, явно устанавливает изображение/любой тип MIME.

Другие советы

Как пользователь будет загружать фотографии?Если вы пишете страницу ASP для приема загруженных файлов, тогда только пользователю, под которым работает IIS, потребуется разрешение на запись в папку, поскольку IIS будет выполнять файловый ввод-вывод.Ваша страница ASP должна проверять размер файла и иметь некоторую форму аутентификации, чтобы хакеры не смогли заполнить ваш жесткий диск.

Если вы настраиваете FTP-сервер или какой-либо другой метод передачи файлов, ответ будет зависеть от выбранного вами метода.

Вам придется предоставить разрешения на запись, но вы можете проверить MIME-тип файла, чтобы убедиться в наличии изображения.Вы можете использовать FSO следующим образом:

set fs=Server.CreateObject("Scripting.FileSystemObject")
set f=fs.GetFile("upload.jpg")
'image mime types or image/jpeg or image/gif, so just check to see if "image" is instr
if instr(f.type, "image") = 0 then
   f.delete
end if
set f=nothing
set fs=nothing

Кроме того, большинство загружаемых COM-объектов имеют свойство типа, которое можно проверить перед записью файла.

Лучше всего, вероятно, использовать компонент загрузки (я использовал ASPUpload), который позволяет загружать/скачивать файлы из папки, которая недоступна с веб-сайта.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top