我想传输敏感信息,例如index.html
,只能在页面加载期间从JavaScript访问。之后,页面上的JavaScript应该无法访问该数据。
我可以在加载时轻松地从DOM中删除敏感数据,但我还需要阻止使用XMLHTTPRequest
加载页面或从IFrame中抓取页面。
我可以使用X-Frame-Options标头和其他框架破坏技巧来阻止IFrame但是如何阻止使用XHR加载页面?
我提出的最佳解决方案是使用index.html
指令中不包含self
的CSP标头为connect-src
提供服务但是我不能将XHR提供给任何人我的服务器上的URL,我需要列出所有其他可能的连接目标。必须有更好的方法来做到这一点。
答案 0 :(得分:3)
我认为您最好的选择是检查X-Requested-With
标头的值XMLHttpRequest
,因为大多数客户端框架/库在使用XHR访问您的网站时都会发送该标头。
但是,这样做不会阻止每次尝试使用XHR加载页面,因为它不是强制性的XHR标头,可能会被欺骗。
我不知道在这种情况下如何设置CSP标头会有所帮助,因为它应该保护您的应用/网站不会访问恶意内容,而不是保护您的应用/网站不被访问。
“内容安全策略是一种声明性策略,允许Web应用程序的作者(或服务器管理员)通知客户端应用程序期望加载资源的来源”
来源:Content Security Policy 1.1
旁注:如果您的JavaScript从DOM中删除了敏感信息,用户仍然可以通过控制台或检查页面源来访问它。
实际用例是什么?
答案 1 :(得分:1)
假设我想保护CSRF令牌不被XSS攻击“窃取”。
如果您有XSS漏洞,则完全丢失。此时,攻击者基本上可以读取和控制用户可以在该源(通常是在该主机名下托管的所有内容:端口组合)中的所有相同信息。攻击者此时通过瞄准CSRF令牌几乎没有收获,他们已经有了更深层次的妥协。
尝试阻止XMLHttpRequest,框架和cookie读取(httponly)可能会使攻击者的生活稍微烦恼但却无法有效阻止访问。
同源策略是您必须依赖的所有内容,因此您应该将您的努力用于避免成功的XSS攻击。
答案 2 :(得分:0)
在页面加载后通过Ajax / POST加载敏感数据可能是一个更好的主意,并通过会话cookie或用户名/密码保护来处理安全性。