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