禁用跨域ajax请求

mka*_*ski 5 javascript security ajax cross-domain cors

有没有办法禁用跨域ajax请求?

假设有两个域:mywebsite.comhackerswebsite.com。在mywebsite.com 上有一个网站,其中包含带有 AJAX 功能的 javascript,可将数据发送到hackerswebsite.com。我想要的只是防止这种情况发生,只允许向mywebsite.com域发送 AJAX 请求。

我知道有类似“同源策略”之类的东西,但我理解它适用于第二个域并且可以阻止来自其他域的连接。

更准确地说,假设我有一个网站,用户可以在其中运行自己的 javascript。如果他们可以编写自己的脚本,他们可以从 DOM 文档中获取任何数据并将其异步发送到他们自己的服务器,该服务器将接受来自我的域的数据。例如登录名。我对吗?

如果我错了,请纠正我。我只是想了解这个安全政策。

aps*_*ers 6

听起来您想要一个内容安全策略(CSP) 来限制页面可以使用和不可以使用的资源和 Ajax 目标。

同源策略的目的是防止网站阅读来自第三方资格的反应(如,我加载evil.com,并且该网站指示我的浏览器来获取我的网上银行对账单,用我的bank.com饼干)。SOP并非旨在阻止用户或站点随心所欲地发送数据。

该站点的 CSP 旨在将资源访问列入白名单,如果出现以下任一情况:

  1. 该站点受到 XSS 攻击并突然以您未预料到的方式运行,或
  2. 该站点在用户 B 拥有的浏览器上运行用户 A 提供的内容,并且该内容需要进行沙盒处理。

需要明确的是,第 2 种情况的危险不是用户可以运行自己JavaScript,而是用户可能运行其他用户的脚本。

CSP 示例可能是:

Content-Security-Policy: default-src 'self'; frame-src 'none'; object-src 'none';
Run Code Online (Sandbox Code Playgroud)

这将阻止任何加载 iframe 或插件的尝试,并将所有其他资源加载(包括图像、脚本、样式表和 Ajax 请求)限制到当前源。如果您想允许插件或 iframe,您可以删除其中一个或那些指令,它们将回退到该default-src指令。您可以使用该connect-src指令专门限制 Ajax。

另请注意,如果您让用户运行任意脚本,您可能仍然会遇到严重的问题(例如,使用误导性内容重写页面),即使使用非常严格的 CSP 来处理跨域网络请求。