Content-Type: text/plain 标头是否可以防止浏览器中的 XSS?

信息安全 网页浏览器 xss
2021-08-22 13:19:37

我正在创建一个小型 Web 脚本,该脚本主要重定向浏览器,但在无法验证输入参数时会出现一些错误情况。

我想显示错误消息,例如参数 XXX 的值 YYY 无效,但如果在输出之前未正确转义参数值,则会将脚本打开到 XSS 攻击。仅设置Content-Type响应是否足够安全,text/plain或者 XSS 攻击仍然可能?

1个回答

您不得依赖浏览器尊重content-type标头的安全性。快速浏览一下CVE-2010-1420应该会给您一个想法。攻击者可以操纵在浏览器中实现的内容嗅探机制来触发 XSS 攻击( Web 浏览器的安全内容嗅探:调查)。

内容嗅探行为调查

在此处输入图像描述

根据这项调查,您可能会看到,Safari 浏览器可能会导致问题,即使这在其他浏览器中不是问题(我可以将错误 637981添加 到此列表中)。

更进一步:

您可以通过允许您的 Web 服务器强制浏览器禁用 MIME 嗅探来进一步保护您的应用程序:

  X-Content-Type-Options: nosniff

由于您试图防御的攻击可以通过您今天或明天允许访问者上传的文件来完成,因此您可以强制浏览器向用户显示文件保存对话框。noopen设置了 header 时,用户不能直接打开文件,因为他将被强制先将文件保存在本地,这会阻止文件在当前浏览器上下文中呈现。您可以通过以下方式实现:

Content-Disposition: attachment; filename=untrustedfile.html

此外,在最后一种情况下(我的意思是如果您允许用户上传文件),您可以向您的 Web 应用程序添加另一个安全层(风险嗅探):

  • 使用白名单确保只允许有限数量的文件扩展名
  • 将上传的文件存储在 Web 根目录之外,并使用安全的下载脚本从磁盘加载这些文件并将其内容呈现给用户;
  • 使用不可预测的文件名并更改文件扩展名。