如何保护用于允许用户上传文件的文件夹?

How do I secure a folder used to let users upload files?

提问人:Eduardo Molteni 提问时间:8/22/2008 最后编辑:Peter MortensenEduardo Molteni 更新时间:4/21/2010 访问量:5467

问:

我的 Web 服务器中有一个文件夹,用于用户使用 ASP 页面上传照片。

授予 IUSR 对文件夹的写入权限是否足够安全?我必须获得其他东西吗? 我害怕黑客绕过ASP页面,直接将内容上传到文件夹。

我在 Windows 2003 Server 上使用 ASP classic 和 IIS6。上传是通过 HTTP,而不是 FTP。

编辑:为了清楚起见,更改问题并将我的答案更改为评论。

安全 IIS IIS-6 Windows-Server-2003

评论


答:

1赞 Ben Williams 8/22/2008 #1

用户将如何上传照片?如果要编写 ASP 页以接受上载的文件,则只有运行 IIS 的用户需要对文件夹的写入权限,因为 IIS 将执行文件 I/O。您的 ASP 页面应检查文件大小并进行某种形式的身份验证,以防止黑客填满您的硬盘驱动器。

如果您正在设置 FTP 服务器或其他一些文件传输方法,那么答案将特定于您选择的方法。

评论

0赞 Eduardo Molteni 9/8/2008
是的,我正在使用 ASP 页面进行上传,但是......授予 IUSR 对文件夹的写入权限是否安全?如果黑客试图发布到同一文件夹,IIS 也会参与其中。
0赞 pilif 9/8/2008
这可能是最方便的方法。另一种解决方案是连接回服务器本身,例如通过FTP重新上传上传的文件,但麻烦的安全利益并不值得。
0赞 chrisofspades 8/24/2008 #2

您必须授予写入权限,但您可以检查文件的 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 对象都有一个 type 属性,您可以在写入文件之前检查该属性。

评论

0赞 Eduardo Molteni 9/8/2008
你弄错了。我问的是黑客绕过ASP页面的情况。
0赞 nlucaroni 9/8/2008
您也不能保证 MIME 类型是正确的,因为它是由浏览器传递的(我记得)。应该通过 ImageMagik 之类的东西打开图像,并检查是否可以正确读取尺寸。
3赞 pilif 9/8/2008 #3

此外,我建议不要让用户上传到可从 Web 访问的文件夹中。即使是最好的 MIME 类型检测也可能失败,并且您绝对不希望用户上传,例如,在 MIME 嗅探失败的情况下伪装成 jpeg 的可执行文件,但 IIS 中的可执行文件可以正常工作。

在PHP世界中,情况更糟,因为攻击者可以上传恶意PHP脚本,然后通过Web服务器访问它。

始终,始终将上传的文件存储在文档根目录之外的目录中,并通过一些访问脚本访问它们,该脚本会进行额外的清理(并且至少显式设置图像/任何MIME类型。

评论

0赞 Eduardo Molteni 9/12/2008
我接受了答案,但我仍然不确定是否真的必须将文件放在文档根目录之外的目录中。我认为这会增加一些性能问题。
0赞 pilif 9/12/2008
如果您注意缓存是否正常工作,则性能问题可以忽略不计。我已经在这里的另一个问题中回答了如何做到这一点:beta.stackoverflow.com/questions/48555/......
0赞 user14094 9/17/2008 #4

最好的选择可能是使用上传组件(我使用过 ASPUpload),它允许您从无法从网站访问的文件夹中上传/下载文件。

您将获得一些身份验证钩子,并且不必担心有人随便浏览文件夹并下载文件(或上传文件,因为这些文件只能通过组件使用)。