XHR 补丁可以防止 XSS 的副作用吗?

信息安全 Web应用程序 xss javascript jwt 单页应用
2021-08-15 11:19:58

XSS 和单页应用程序

我正在研究网络安全,并且已经看到基于令牌的身份验证对 CSRF 预防、分布式系统架构和处理性能有好处。

但另一个问题是 XSS。不是专门讨论注入本身,而是库。对于单页应用程序,开发人员通常会在他们的代码中包含数百个不同的模块,这些模块以后可能会在应用程序投入生产时恶意执行。

修补 XMLHttpRequest

所以我有了修补 XMLHttpRequest 属性并控制原始“本机代码”功能的想法,防止第三方代码发出 ajax 请求。

(function () {
  // my code
  let XHR = window.XMLHttpRequest
  window.XMLHttpRequest = null
})()

// load third-party code after...

我在控制台中使用 facebook 和 youtube 对此进行了测试......他们所有的 ajax 加载内容都停止工作。

恶意示例

未捕获的恶意行为的一个示例是仅通过检查 window.location 是否类似于“app.x.com”而在生产中执行的代码,因此开发人员在开发过程中没有意识到 ajax 请求。

修补 XMLHttpRequest 属性可以防止这种情况发生,并考虑到所有其他措施都可以防止 XSS(清理),这将缩小最终差距并让您控制网络请求,防止恶意代码窃取身份验证令牌。

最后的怀疑

这种方法有什么警告吗?(安全方面)

2个回答

这种方法有什么警告吗?(安全方面)

是的,它不是很彻底,您可以从新的窗口对象中获取构造函数的新实例:

XMLHttpRequest = null;

var iframe = document.createElement('iframe');
iframe.style.display = 'none'; // optional
document.body.appendChild(iframe);
var XHR = iframe.contentWindow.XMLHttpRequest;
console.log(new XHR());

您必须覆盖更多内容以确保XMLHttpRequest无法访问 a,这只是执行此操作的一种方法。

对于 XSS 保护,只需使用内容安全策略并仅使用来自受信任来源的受信任库。

即使这可行并且您可以阻止 JavaScript 执行 XMLHttpRequests - 如@Alexander 所示,情况并非如此(ActiveXObject 将是另一种选择) - 它并没有真正限制 XSS 的危险。

攻击者仍有多种可能性:

  • 污损
  • 网络钓鱼:例如,添加一个登录表单,它将输入的数据发送到攻击者控制的服务器
  • 提取数据:虽然攻击者无法通过 XMLHttpRequest 发送获取的数据,但他们可以通过元标记刷新强制重定向并以这种方式发送数据。
  • CSRF:可以如上所述获取令牌,然后可以通过 JavaScript 创建和提交表单。
  • 网络请求:上面的表单示例也是如何在不使用 XMLHttpRequests 的情况下执行任何网络请求。

确实没有什么好的方法可以防止所有这些问题(至少,您需要防止对 DOM 进行任何更改,我认为这是不可能的)。

您需要信任您使用的第三方 JavaScript 库。

如果您不信任供应商,则需要自己重现该功能。