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

17

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

例如,如果我的网站允许用户上传个人头像,但其中一个用户上传了有害内容,会发生什么?我应该设置什么样的安全措施来防止此类攻击?在这里我谈论的是图像,但是如果用户可以将任何东西上传到类似文件保险库的应用程序中呢?

这更像是一个普遍性的问题而不是关于特定情况的问题,所以在这种情况下,有哪些最佳实践?你通常会怎么做?

我推测:上传时进行类型验证,为上传的文件设置不同的权限...还有什么?

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

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

6个回答

10

你的第一道防线将是限制上传文件的大小,并终止任何大于该大小的传输。

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

为什么需要文件扩展名验证?因为这是大多数Web服务器用来识别可执行文件的方式。如果您的可执行文件没有锁定到特定目录(大多数情况下是这样),具有某些扩展名的文件将在站点文档根目录下的任何地方执行。

使用白名单对想要接受的文件类型进行最佳的文件扩展名检查。

一旦验证了文件扩展名,您可以通过检查魔术字节或使用Unix文件命令来验证所述文件是否是其扩展名声明的类型。

我相信还有其他问题我没有提到,但希望这有所帮助。


我尝试保持这种语言的中立性,但对于PHP来说,手册中有一个关于#1的部分:http://us3.php.net/manual/en/features.file-upload.common-pitfalls.php - Powerlord
但是如果我允许用户上传可能会对系统造成危害的文件,例如.exe文件或.sh脚本,该怎么办呢?这是我应该禁止的吗? - marcgg
是的... 要么就只允许接受白名单上的文件扩展名。 - Powerlord

6
假设你只处理图像,你可以使用图像库生成缩略图/一致的图像大小,完成后将原始文件删除,这样你就有效地拥有一个漏洞点:你的图像库。假设你保持它的最新状态,应该就没问题了。
如果用户上传压缩文件或非图像文件,则图像库会因尝试调整非图像数据而失败,你可以捕获异常。不过你可能需要先检查文件名扩展名。如果文件名是“foo.zip”,那么通过图像库发送文件就没有意义了。
至于权限...不要设置执行位。但实际上,权限对防范恶意用户输入的保护作用不大。
如果您的编程环境允许,您可能需要在上传过程中运行其中一些检查。 恶意的HTTP客户端可能会发送一个无限大小的文件。 即使是随机字节也不停止传输,导致拒绝服务攻击。 或者他们只是将1GB的视频上传为其个人资料图片。 大多数图像文件格式也有一个开头的标头。 如果客户端开始发送与任何已知图像标头都不匹配的文件,则可以中止传输。 但这开始进入过度杀伤的领域。 除非您是Facebook,否则这种事情可能是不必要的。

编辑

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

我忘了在哪里看到的,但我曾看过一份指南,介绍如何将ClamAV作为筛选器连接到Apache中...至少我认为是连接到Apache中。 - Powerlord

1

1

大小验证也很有用,不想让有人故意上传一个100GB的假图片来恶意占用你的空间吧 :)

此外,你可能需要考虑一些措施来防止人们仅仅为了方便地托管图片而滥用你的带宽(我最担心的是非法内容的托管)。大多数人会使用imageshack来进行临时图片托管。


0

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


0

有更多的上下文,就更容易知道漏洞可能存在的位置。

如果数据可以存储在数据库中(听起来似乎不会),那么您应该防范SQL注入攻击。

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

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

不要忽视用户数据安全性:您的用户能否信任您防止其数据被泄露?

编辑:如果您真的想要覆盖所有基础知识,请考虑JPEGWMF安全漏洞的风险。如果恶意用户可以从一个系统上传文件,然后从另一个系统查看文件--或者说服另一个用户查看文件--那么这些漏洞可能会被利用。


HTML/CSS注入并不适用于上传的文件,而这正是问题所在。 - Bob Aman
Sporkmonger:正如我所写的,这取决于上下文。根据问题的措辞方式,肯定有一些系统可以符合该描述,并可能存在这些漏洞。 - Dan Breslau
1
好的。上传HTML是可能的,如果他不小心的话,他可能会意外地将其作为页面提供。 - Bob Aman
我并不是真的在谈论XSS攻击或类似的事情,但这仍然是需要记住的。阅读关于JPEG和WMF安全问题的内容非常有趣。 - marcgg
“HTML/CSS Injection”中的CSS在哪里? - halfbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接