禁用跨域Ajax请求

5

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

假设有两个域名:mywebsite.comhackerswebsite.com。在mywebsite.com上有一个包含javascript的网站,其中包含AJAX函数,该函数会将数据发送到hackerswebsite.com。我想做的就是防止这种情况的发生,并且只允许向mywebsite.com域发送AJAX请求。

我知道有类似于“同源策略”的东西,但是我理解它只能在第二个域名上起作用,并且可以防止来自其他域名的连接。

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

如果我错了,请纠正我。我只是想理解这个安全策略的事情。


1
所以他们可以进行GET请求并发送相同的信息!img.src="asdf.php?myInfo=goesHere"; - epascarello
您不需要让用户在您的页面上运行脚本,才能获取 DOM/BOM 中可见的任何数据。他们可以直接查看这些数据,并将其传输到任何地方。 - marekful
我想给他们运行自己脚本的可能性。不是看页面数据,只是运行他们自己的东西。 - mkatanski
@espascarello 我不明白。 - mkatanski
客户端可以使用任何访问公开数据的方法,并以任何希望的方式使用它。一旦数据被泄露,你就无法再控制它了。如果你想保护某些东西,就将其放在登录后面。 - Diodeus - James MacFarlane
1个回答

6

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

同源策略旨在防止网站从第三方读取认证响应(例如,我加载evil.com,该站点指示我的浏览器使用我的bank.com cookie获取我的在线银行对账单)。SOP并不意味着阻止用户或站点将数据发送到任何地方。

该站点的CSP旨在允许访问资源的白名单,以防以下情况之一发生:

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

明确一下,案例#2中的危险不是用户可以运行自己的JavaScript,而是用户可能运行其他用户的脚本。

一个示例CSP可能是:

Content-Security-Policy: default-src 'self'; frame-src 'none'; object-src 'none';

这将阻止任何尝试加载iframe或插件的行为,并将所有其他资源加载(包括图像、脚本、样式表和Ajax请求)限制在当前来源。如果您想允许插件或iframe,则可以删除其中一个指令,它们将退回到"default-src"指令。您可以使用“connect-src”指令专门限制Ajax。请注意,如果您让用户运行任意脚本,即使非常严格的CSP处理跨源网络请求,您仍可能面临严重问题(例如,使用误导性内容重写页面)。

所以如果我理解正确的话,这个安全策略将阻止 AJAX 连接到除了我的域名之外的任何其他域名?我不担心检索数据,我担心未经授权地向任何其他服务器发送数据。 - mkatanski
@Katan87,没错;我例子中的'self'表示“仅此来源”。任何尝试加载资源或向另一个来源发送Ajax请求的尝试都将失败。 - apsillers
这就是我想知道的全部。现在我会尝试一下 :) 我知道其他问题,但在我的情况下这不是什么大问题。非常好的答案! - mkatanski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接