我的网站将为最终用户托管文档,我希望尽可能安全。
问题
假设我需要在可能包含恶意代码的网站上共享文档,我应该如何保护自己和最终用户?
我的网站将为最终用户托管文档,我希望尽可能安全。
问题
假设我需要在可能包含恶意代码的网站上共享文档,我应该如何保护自己和最终用户?
听起来您担心查看来自不受信任来源的文档(例如,担心恶意文档可能利用您的 PDF 查看器或 Word 等中的漏洞的风险)。这是一个合理的担忧。
如果这是问题所在,缓解它的一种方法是使用 Google Docs 查看文档。Google Docs 提供了在您的网络浏览器中查看文档的功能。Google 在 Google 的服务器上将文档转换为 HTML,然后将 HTML 发送到您的浏览器。然后,谷歌负责确保他们的服务器能够安全地处理恶意文档。这是保护自己免受恶意文档侵害的合理方法。
主要的缺点是它可能不适合查看机密文档,因为您必须先将它们上传到 Google,然后才能以这种方式查看它们。
另一种防御措施是让您的文档查看器完全打补丁。我建议打开 Adobe Reader 和 Microsoft Office 的自动更新。这是降低风险的另一种方法。
当我必须在将文件从源格式转换为另一种格式,有时再转换为第三种格式之前解决这个问题时。
如果 Open/LibreOffice 支持您的文档格式,您可以使用--convert-to pdf
. 然后您可以获取该 PDF 并进一步操作它,例如使用 ImageMagick:
convert source.pdf source-page-%d.jpg
convert -page A4 --compress jpeg source-page-*.jpg source.pdf
将这 3 个链接在一起意味着您最终会得到一个内容为呈现页面的 PDF,这应该是非常安全的。
作为网站所有者,您能做的只有这么多。保护用户免受恶意文档侵害的主要责任在于制作文档查看器的软件供应商(例如,Adobe、Microsoft 和潜在的浏览器供应商)。他们是有机会最好地帮助他们的用户的人;你的杠杆更有限。
也就是说,您可以/应该采取以下步骤,以尽可能地保护您的用户:
仅允许列入白名单的文档类型。创建 MIME 类型的白名单,代表您认为相对安全且需要支持的重要文档格式。(此白名单可能包括 PDF、Word、Powerpoint、Excel 电子表格等,但不包括本机可执行文件、Flash 视频、zip 或 jar 档案、HTML 或 Javascript 等。)当用户上传文档时,检查它是否在白名单中。当您将此文档提供给其他人时,请遵循我在其他地方概述的做法来防御内容类型的嗅探攻击。最重要的是Content-Type:
使用先前验证的 MIME 类型在您提供图像的 HTTP 响应上设置正确的标头。此外,包括一个X-Content-Type-Options: nosniff
标头,以防止某些版本的 IE 尝试进行内容类型嗅探。除了防御内容嗅探攻击外,这还将防止攻击者上传浏览器特别处理的其他文件(例如,crossdomain.xml
HTML5 清单文件等)。
验证文件名。上传文件名时对其进行完整性检查。例如,您可以检查它们是否匹配正则表达式,例如[a-zA-Z-_!(),: ]*(\.[a-zA-Z]+)?
. 特别是,您希望排除斜杠(以防止路径遍历)。此外,请检查扩展名(如果存在)是否与经过验证的 MIME 类型匹配,并且是否在已知安全扩展名的白名单中。您可能需要检查文件名是否包含两个扩展名(例如,foo.txt.exe
),以防止社会工程攻击。
或者,您可以为每个文档生成一个随机文件名。这将是最安全的,但它可能会降低可用性。第三种选择是仅当原始文件名未通过有效性检查时才替换原始文件名。
可选:扫描文件上传以查找病毒或恶意软件。 上传文件时,您可能需要使用病毒扫描程序来检查已知病毒或恶意软件。您可以使用本地病毒扫描程序,但将其上传到VirusTotal可能更容易。我会在上传时执行此操作,随后也可能定期执行此操作(例如,每 1000 次后续下载一次,或每周一次),因为有时更新的病毒定义文件会在旧文档中捕获更多病毒。如果可以提供更好的性能,则可以异步或以批处理模式执行此操作;如果病毒检查失败,您可以随时删除该文件。
可选:使用单独的域来托管文件上传。您可以将文档托管在一个单独的域上,该域仅用于托管用户上传的文档。这将限制某些浏览器级别攻击的影响,例如内容类型嗅探。然而,这并不能防御利用文档查看器中的漏洞(例如,缓冲区溢出、双重释放)并让攻击者执行本机代码的代码注入攻击。
为拒绝服务和垃圾邮件设置障碍。限制最大文件大小,以避免被提交的内容淹没。如果您允许未经身份验证的用户上传文件,请要求用户在上传过程中解决 CAPTCHA。
可选:检测过时的浏览器和插件。扫描用户的浏览器。如果他们运行的是旧浏览器(如 IE6)或旧插件,请考虑提供他们更新的建议,以在他们浏览网络时保护自己。这里有一些资源可以帮助解决这个问题:
如果您想推荐 IE6 用户更新,IE6 更新可以很容易地向您的网站添加一点代码,以检测正在使用 IE6 的用户,并提示他们更新浏览器。
如果您想更灵活地了解哪些浏览器版本会触发鼓励用户升级的小通知,请查看browser-update.com。
如果您必须检查过期或已知易受攻击的插件,Mozilla 插件检查可能会很有用。它支持 Firefox、Safari、Chrome 和 Opera,部分支持 IE。他们的插件版本数据库也有一个编程 API 。基于此,您可能会编写一些代码来自动检查用户的插件,如果他们有您支持的文档类型的过时插件(例如,Adobe PDF 查看器插件的旧版本),您可以触发鼓励用户升级插件的通知。
关于DW 的回答:
在我看来,最安全的实现是为每个文件创建唯一的 DNS 域,因此一次下载的问题不太可能影响存储库中的其他文件。
这可以分两部分实现:首先,从 DNS 中的通配符条目开始,该条目指向保存文件的 Web 服务器(例如 *.userfiles.com
)。这个想法是,当有人请求时,/Accounting/budget.xls
他们将转到以下预先计算的 url。在这种情况下,域前缀是 URL 的 MD5 哈希:
https://fd4929a6ea48f85130f5a43f89cb7dd6.userfiles.com/Accounting/budget.xls
其次,服务器端代码可以验证“fd4929a6ea48f85130f5a43f89cb7dd6”是所请求文件的MD5。然后,服务器端组件可以在运行时检查此值并允许或拒绝访问。
例子:
https://96a077f305f5720221b338863ea8e3d7.userfiles.com/tech/SecurityPolicy.docx - OK
https://fd4929a6ea48f85130f5a43f89cb7dd6.userfiles.com/Accounting/budget.xls - OK
https://fd4929a6ea48f85130f5a43f89cb7dd6.userfiles.com/Accounting/Budget.xls - Fails Checksum
https://fd4929a6ea48f85130f5a43f89cb7dd6.userfiles.com/Accounting/forecast.xls - Fails checksum