用户可以上传自己的文件时会出现哪些安全问题?

时间:2009-05-06 18:09:59

标签: security

我想知道当网站的最终用户可以将文件上传到服务器时会出现什么样的安全问题。

例如,如果我的网站允许用户上传个人资料图片,而一个用户上传了有害的内容,那么可能会发生什么?我应该设置什么样的安全措施来防止这样的攻击?我在这里谈论图像,但是用户可以将任何内容上传到文件库类应用程序的情况呢?

这是一个普遍问题,而不是关于具体情况的问题,那么在这种情况下最佳做法是什么?你通常做什么?

我想:在上传时输入验证,different permissions for uploaded files ......还有什么?

编辑:为了清理上下文,我正在考虑一个Web应用程序,用户可以上传任何类型的文件,然后在浏览器中显示它。该文件将存储在服务器上。用户是使用该网站的用户,因此不涉及任何信任。

我正在寻找适用于不同语言/框架和生产环境的一般答案。

6 个答案:

答案 0 :(得分:8)

你的第一道防线是限制上传文件的大小,并杀死任何大于该数量的转移。

文件扩展验证可能是一个很好的第二道防线。类型验证可以在以后完成...只要您不依赖于(用户提供的)mime类型进行所述验证。

为什么要进行文件扩展验证?因为这是大多数Web服务器用来识别哪些文件是可执行的。如果您的可执行文件没有被锁定到特定目录(并且很可能不会被锁定),则具有特定扩展名的文件将在该站点的文档根目录下的任何位置执行。

文件扩展名检查最好使用您要接受的文件类型的白名单。

验证文件扩展名后,您可以通过检查魔术字节或使用unix file命令检查验证所述文件是否为其扩展名声明的类型。

我确信我错过了其他一些问题,但希望这会有所帮助。

答案 1 :(得分:5)

假设您只处理图像,您可以做的一件事是使用图像库生成缩略图/一致的图像大小,并在完成后抛弃原始图像。然后,您实际上有一个点的漏洞:您的图像库。假设你保持最新,你应该没事。

用户将无法上传zip文件或任何非图像文件,因为如果图像库尝试调整非图像数据的大小,则会进行barf,并且您可以捕获异常。您可能希望对文件扩展名进行初步检查。如果文件名为“foo.zip”,则无法通过图像库发送文件。

至于权限,那么......不要设置执行位。但实际上,权限无助于保护您免受恶意用户输入。

如果您的编程环境允许,您将需要在上载过程中运行其中一些检查。恶意HTTP客户端可能会发送无限大小的文件。 IE,它永远不会停止传输随机字节,导致拒绝服务攻击。或者他们只是上传一个视频作为他们的个人资料图片。大多数图像文件格式在开头也有一个标题。如果客户端开始发送与任何已知图像标头不匹配的文件,则可以中止传输。但那已经开始进入矫枉过正的境界。除非你是Facebook,否则这种事情可能是不必要的。

修改

如果您允许用户上传脚本和可执行文件,则应确保通过该表单上传的任何内容永远不会以application/octet-stream之外的其他内容形式提供。当您处理潜在危险的上传时,请勿尝试混合Content-Type。如果您要告诉用户他们必须担心自己的安全性(这实际上是您接受脚本或可执行文件时所执行的操作),那么所有内容都应该作为application/octet-stream提供,以便浏览器不会尝试渲染它。您还应该设置Content-Disposition标头。如果要处理可执行文件,将病毒扫描程序包含在管道中可能也是明智之举。例如,ClamAV是可编写脚本的开源软件。

答案 2 :(得分:1)

尺寸验证也很有用,不希望有人故意上传一张100gb的假图片,现在就不用了。)

此外,您可能需要考虑一些事情来防止人们使用您的带宽只是为了一种简单的方式来托管图像(我主要关心的是托管非法内容)。大多数人无论如何都会使用imageshack进行临时图像托管。

答案 3 :(得分:1)

为了进一步阅读,Acunetix在Why File Upload Forms are a Major Security Threat

上发表了一篇很棒的文章

答案 4 :(得分:0)

通过更多背景信息,可以更容易地了解漏洞可能存在的位置。

如果数据可以存储在数据库中(听起来不会这样),那么你应该防范SQL Injection攻击。

如果数据可以在浏览器中显示(听起来像是这样),那么您可能需要防范HTML/CSS Injection攻击。

如果您在服务器上使用脚本语言(例如,PHP),那么您可能需要防止针对这些特定语言的注入攻击。使用已编译的服务器代码(或糟糕的脚本实现),存在缓冲区溢出攻击的可能性。

不要忽视用户数据安全性:您的用户是否可以信任您以防止他们的数据受到侵害?

编辑:如果您真的想要涵盖所有基础,请考虑JPEGWMF安全漏洞的风险。如果恶意用户可以从一个系统上传文件,然后从另一个系统查看文件(或说服其他用户查看文件),则可以利用这些文件。

答案 5 :(得分:0)

内容的大小 限制某些文件类型(.jpeg,.png等,应该只允许列入白名单的文件类型) 文件篡改(例如:支持外语的网站,允许某些编码。黑客可以利用此功能并添加任何编码的脚本/恶意代码并附加到原始文件并尝试上传)