我正在创建一个小型 Web 脚本,该脚本主要重定向浏览器,但在无法验证输入参数时会出现一些错误情况。
我想显示错误消息,例如参数 XXX 的值 YYY 无效,但如果在输出之前未正确转义参数值,则会将脚本打开到 XSS 攻击。仅设置Content-Type响应是否足够安全,text/plain或者 XSS 攻击仍然可能?
我正在创建一个小型 Web 脚本,该脚本主要重定向浏览器,但在无法验证输入参数时会出现一些错误情况。
我想显示错误消息,例如参数 XXX 的值 YYY 无效,但如果在输出之前未正确转义参数值,则会将脚本打开到 XSS 攻击。仅设置Content-Type响应是否足够安全,text/plain或者 XSS 攻击仍然可能?
您不得依赖浏览器尊重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 应用程序添加另一个安全层(风险嗅探):