内容嗅探。你的提议还不够:它很容易受到内容嗅探攻击。我在其他地方写过关于防止内容嗅探攻击的策略。有多种防御方式。以下是主要的:
Content-Type:
在响应中包含标头。确保它包含有效的 MIME 类型(避免无效的 MIME 类型。)
X-Content-Type-Options: nosniff
在响应中包含标头。这将在最新版本的 IE 上关闭 IE 的内容嗅探算法。
如果您不打算在浏览器中查看内容,可以设置Content-Disposition: attachment
, 以使浏览器将其视为文件下载。
即使这些步骤也不能保证足够。例如,如果用户使用的是 IE6,他们仍然容易受到攻击。
(如果这听起来很烦人,那你肯定是对的。责怪 Apache 的人包含了一个糟糕的默认配置,多年来违反了 Web 标准,并且忽略了对它做点什么的请求。不幸的是,现在为时已晚:我们被卡住了拥有大量部署的浏览器,这些浏览器会做危险的事情。)
单独的域。更好的防御措施是将用户提供的内容托管在单独的域上,该域仅用于用户上传的内容。这样,成功的内容嗅探攻击就不会攻击您网站的内容。一个用户的上传仍然可以攻击其他用户的上传,但这可能是可以容忍的。
检查您的白名单。您似乎认为 PDF 和 Word 文件是无害的。然而,这是两种强大而危险的文件格式。PDF 因是矢量而臭名昭著。恶意 PDF 文件比比皆是,并且可以成功渗透到许多较旧的 PDF 查看器中。PDF 风险如此之高,以至于 Chrome 在允许您在 PDF 查看器中下载和查看 PDF 文档之前采取了特殊的预防措施。Word 也是一种强大而危险的文件格式,可能成为攻击的宿主。因此,我不会认为 Word 或 PDF 是无害的。
您可以将用户重定向到 Google 文档,以通过 Google 文档在浏览器中查看 Word/PDF 文件。Google 会将 Word/PDF 文件转换为 HTML,然后将其发送到查看者的浏览器。在您的情况下,这可能会或可能不会被接受。
扫描文件上传以查找病毒。我建议您使用一些病毒或恶意软件扫描程序扫描所有用户上传的内容以查找病毒。对于 PDF 文件,另请参阅如何扫描 PDF 中的恶意软件?. 您可能希望在上传后立即对其进行扫描。您还可以考虑定期重新扫描旧文件(这可能会捕获一些以前未检测到的恶意软件,因为防病毒/恶意软件定义已更新)。
更多信息。另请参阅Mozilla 的文件上传清单,在其安全编码标准中。这是一个很好的安全实践列表。
概括。总之,您可以使用的最强大和最有效的防御措施是将用户上传的内容放在单独的域中。然后,作为额外的保护,您可能需要考虑此处列出的其他防御措施。
更新:我刚刚了解到您的方案的另一个问题。显然,Flash 忽略了 Content-Type 标头,这可能允许加载恶意 SWF,然后它可以执行您使用 XSS 执行的所有操作。(叹气,愚蠢的 Flash。)不幸的是,再多的白名单也无法阻止这种攻击。因此,似乎唯一安全的解决方案是将用户上传的内容托管在单独的域上。