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

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

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

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

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


person Eduardo Molteni    schedule 22.08.2008    source источник


Ответы (4)


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

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

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

person pilif    schedule 08.09.2008
comment
Я принимаю ответ, но все еще не уверен, действительно ли файл должен находиться в каталоге вне корня документа. Думаю, это добавит некоторых проблем с производительностью. - person Eduardo Molteni; 11.09.2008
comment
если следить за правильно работающим кешированием, проблемы с производительностью будут незначительными. Я ответил, как это сделать, в другом вопросе здесь: beta.stackoverflow.com/questions/48555/ - person pilif; 11.09.2008

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

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

person Ben Williams    schedule 22.08.2008
comment
да, я использую страницу ASP для загрузки, но ... Можно ли дать IUSR разрешение на запись в папку? Если хакер попытается отправить сообщение в ту же папку, IIS тоже будет задействован. - person Eduardo Molteni; 08.09.2008
comment
это, наверное, самый удобный способ. Другим решением было бы подключиться обратно к самому серверу и повторно загрузить загруженный файл, например, через FTP, но выгода от проблемы безопасности на самом деле не стоит того. - person pilif; 08.09.2008

Вам нужно будет предоставить права на запись, но вы можете проверить тип 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-объектов имеют свойство типа, которое можно проверить перед записью файла.

person chrisofspades    schedule 23.08.2008
comment
Вы ошибаетесь. Я спрашиваю про хакеров, обходящих страницу ASP. - person Eduardo Molteni; 08.09.2008
comment
Вы также не можете гарантировать, что тип MIME правильный, поскольку он передается браузером (насколько я помню). Нужно открыть изображение через что-то вроде ImageMagik и проверить, правильно ли читаются размеры. - person nlucaroni; 08.09.2008

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

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

person user14094    schedule 16.09.2008