禁用跨域ajax请求
Posted
技术标签:
【中文标题】禁用跨域ajax请求【英文标题】:Disable cross-domain ajax request 【发布时间】:2013-12-01 21:44:45 【问题描述】:有没有办法?
假设有两个域:mywebsite.com 和 hackerswebsite.com。在 mywebsite.com 上有一个网站,其中包含带有 AJAX 功能的 javascript,可将数据发送到 hackerswebsite.com .我只想阻止这种情况,只允许向 mywebsite.com 域发送 AJAX 请求。
我知道有类似“同源策略”的东西,但据我所知,它适用于第二个域,并且可以阻止来自其他域的连接。
更准确地说,假设我有一个网站,用户可以在其中运行自己的 javascript。如果他们可以编写自己的脚本,他们可以从 DOM 文档中获取任何数据并将其异步发送到他们自己的服务器,该服务器将接受来自我的域的数据。例如登录名。我说的对吗?
如果我错了,请纠正我。我只是想了解这个安全策略。
【问题讨论】:
这样他们就可以发出 GET 请求并发送相同的信息!img.src="asdf.php?myInfo=goesHere";
您不需要用户能够在您的页面上运行他们的脚本来获取在您的 DOM/BOM 中可见的任何数据。他们无论如何都可以看到这些数据,并将其传输到任何他们想要的地方。
我想让他们有可能运行自己的 scipts。不是看页面的数据,只是跑自己的东西。
@espascarello 我不明白
客户可以以任何他们希望的方式使用任何访问公开数据的方法。一旦它出了门,你就不再控制它了。如果您想保护某些东西,请将其放在登录名后面。
【参考方案1】:
听起来您想要一个content security policy (CSP) 来限制页面可以使用和不可以使用的资源和 Ajax 目标。
同源策略旨在防止网站读取来自第三方的凭据响应(例如,我加载了evil.com
,并且该网站指示我的浏览器使用我的bank.com
cookie 获取我的在线银行对账单)。 SOP并非旨在阻止用户或网站发送数据到他们喜欢的任何地方。
网站的 CSP 旨在将资源访问列入白名单,以防出现以下任一情况:
-
该网站受到 XSS 攻击的威胁,并突然以您未预料到的方式运行,或者
该网站在用户 B 拥有的浏览器上运行用户 A 提供的内容,并且该内容需要被沙盒化。
需要明确的是,第 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 连接到除我自己的域之外的任何其他域?我不担心检索数据,我担心在无人看管的情况下将数据发送到任何其他服务器。 @Katan87 没错;'self'
在我的示例 CSP 中表示“仅此来源”。任何加载资源或向另一个源发送 Ajax 请求的尝试都将失败。
这就是我想知道的。现在我会试一试:) 我知道其他问题,这对我来说没什么大不了的。很好的答案!以上是关于禁用跨域ajax请求的主要内容,如果未能解决你的问题,请参考以下文章