【问题标题】:Is it possible to prevent a page being loaded using XHR?是否可以防止使用 XHR 加载页面?
【发布时间】:2013-08-10 00:39:10
【问题描述】:

我想以index.html 的形式传输敏感信息,这些信息只能在页面加载期间通过 JavaScript 访问。之后页面上的 JavaScript 应该无法访问该数据。

我可以在加载时轻松地从 DOM 中删除敏感数据,但我还需要防止使用 XMLHTTPRequest 或从 IFrame 中抓取页面来加载页面。

我可以使用 X-Frame-Options 标头和其他帧破坏技巧来阻止 IFrame,但是如何阻止使用 XHR 加载页面?

我想出的最佳解决方案是为 index.html 提供一个 CSP 标头,该标头在 connect-src 指令中不包含 self,但是我无法 XHR 到我的服务器上的任何 URL,我需要将所有其他可能的连接目标列入白名单。一定有更好的方法来做到这一点。

【问题讨论】:

  • 你能提供页面和脚本的最小示例吗?
  • 我很好奇在您的域上运行的不受信任的脚本是从哪里来的。
  • 假设我想保护 CSRF 令牌不被 XSS 攻击“窃取”。我可以将我的代码和令牌保存在一个闭包中,并且相当安全,但我如何将令牌放入其中?
  • @FabianJakobs 无法向其他域发送 AJAX 请求(除非您以正确的方式为攻击者配置 CORS),但攻击者可以将您的页面包含在 <script> 标记中。跨度>
  • 你的整个前提是有缺陷的。你真的,真的无法以任何远程安全的方式阻止这种情况。您尝试做的整个想法与互联网的本质是对立的。

标签: javascript security browser web


【解决方案1】:

我认为最好的办法是检查 X-Requested-With 标头的 XMLHttpRequest 值,因为大多数客户端框架/库在使用 XHR 访问您的网站时都会发送该标头。

但是,这样做不会阻止每次使用 XHR 加载页面的尝试,因为它不是强制性的 XHR 标头,并且可以被欺骗。


我看不出在这种情况下设置 CSP 标头会有什么帮助,因为它应该保护您的应用/网站免于访问恶意内容,而不是保护您的应用/网站免于被访问。

“内容安全策略是一种声明性策略,它允许 Web 应用程序的作者(或服务器管理员)通知客户端应用程序期望从中加载资源的来源”

来源:Content Security Policy 1.1


附带说明:如果您的 JavaScript 从 DOM 中删除了敏感信息,用户仍然可以通过控制台或检查页面源来访问它。

实际用例是什么?

【讨论】:

    【解决方案2】:

    假设我想保护 CSRF 令牌不被 XSS 攻击“窃取”。

    如果您有 XSS 漏洞,您就完全迷失了。此时,攻击者基本上有权读取和控制用户可以读取和控制该来源(通常是托管在该主机名:端口组合下的所有内容)中的所有相同信息。攻击者此时通过瞄准 CSRF 令牌几乎没有什么收获,他们已经有更深层次的妥协。

    试图阻止 XMLHttpRequest、框架和 cookie 读取(仅限 http)可能会使攻击者的生活稍微烦人,但它们无法有效地阻止访问。

    同源策略是您必须依赖的一切,因此您应该努力避免成功的 XSS 攻击。

    【讨论】:

      【解决方案3】:

      在页面加载后通过 Ajax / POST 加载敏感数据并使用会话 cookie 或用户名/密码保护来处理安全性可能是一个更好的主意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 2011-02-14
        • 2017-04-26
        • 2017-06-27
        相关资源
        最近更新 更多