2014-12-07 111 views
0

我刚刚发现,为了允许跨域AJAX调用,应在SERVER端设置Access-Control-Allow-Origin标头。这让我感到沮丧,让我解释一下为什么:了解CORS安全性:服务器的使用允许浏览器跨域访问?

1)典型的用例是客户想要发出跨域请求。我从来没有听说过一个服务器试图限制来自外部网页的访问。哦,我记得'防止图像盗链',这是我托管的一个有趣功能,可以通过发送假'Referrer`表头轻松击败。

2)即使服务器想要限制来自其他域的连接,使用HTTP协议的功能也无法做到这一点。我建议使用令牌。

3)当你仍然可以使用jsonp时,阻塞XMLHttpRequests有什么用处?

你能解释为什么这样做?

对于那些谁是还在读书,有一个加分题:

4)你知道一种方法来阻止网页上的任何跨域请求?想象一下初级Web开发人员在页面上创建一个登录表单,该页面上有广告或其他脚本可能嗅探密码?这不是网络安全的本质吗?为什么有人在谈论这个?

+1

我相信交叉来源的ajax调用的责任完全奠定了客户端而不是服务器。服务器如何知道请求是否跨域?为什么页面可以向邪恶的服务器发出请求,却无法请求某个人忘记放置'Access-Control-Allow-Origin'头部的服务器? – Dan 2014-12-07 20:54:41

+0

“即使服务器想要限制来自其他域的连接,使用HTTP协议的功能也无法做到这一点,我建议使用令牌。”如果你可以让AJAX请求任意的跨域内容,你可以获得这些令牌。 – 2014-12-07 21:00:14

回答

6

我从来没有听说过一个服务器试图限制来自外部网页的访问。

同源策略是浏览器而不是服务器施加的限制。

CORS是服务器告诉浏览器它可以放松其正常的安全性,因为数据不需要这个级别的保护。


即使服务器要限制从其他域的连接,这是不可能做到这一点使用HTTP协议的能力。

这就是为什么HTTP协议不用于此目的。

我建议使用令牌。

使用nonce防止CSRF解决了另一个问题。

这是一个相对昂贵的解决方案,只有在请求的副作用可能有问题时(例如“发表新评论”),而不是将数据传回到另一个运行的JavaScript现场。

您不能使用它们代替相同原点策略来防止跨源读取数据,因为(没有相同原点策略)攻击性网站将能够读取令牌。


什么用堵的XMLHttpRequest,而你仍然可以使用JSONP的?

除非服务器使用JSONP提供数据,否则不能使用JSONP。

提供在JSONP数据,并使用CORS授予权限访问的资源是两种不同的方式,服务器可以让浏览器访问通常由同源策略保护的数据。

JSONP是一个黑客攻击。 CORS后来出现,并且更加灵活(因为它可以允许访问任何类型的数据,响应除GET以外的请求方法,并允许添加自定义HTTP头)。


你能解释这是为什么那么做?

默认策略是“No Access”,因为浏览器无法知道请求的数据是否是公开的。

考虑这种情况:

Alice在Bob的网站上有一个帐户。该帐户受密码保护,并具有Alice和Bob之间应保密的信息(例如银行记录或考试结果)。

Mallory有另一个网站。它使用Ajax尝试访问Bob的网站。

没有同源策略,爱丽丝可能(而在Bob的网站登录)参观马洛里的网站。如果没有Alice的知识或许可,Mallory的网站会将JavaScript发送到Alice的浏览器,该浏览器使用Ajax从Bob网站获取数据。由于它来自Alice的浏览器,因此Alice的所有私人信息都被提供给JavaScript。 JavaScript然后将其发送给Mallory。

这显然不是一件好事。

相同来源策略可以防止这种情况发生。

如果Bob,作为运行网站的人,决定该信息不是保密的,可以公开分享,那么他就可以利用CORS或JSONP提供给其他网站上运行的JavaScript访问它。


你知道一种方法来阻止网页上的任何跨域请求。

号的网页是一个单独的实体。试图从其他部分监控它的一部分是愚蠢的事情。

想象一下初级web开发人员在页面上创建登录表单,该页面上有广告或其他脚本可能会嗅探密码?这不是网络安全的本质吗?为什么有人在谈论这个?

“小心信任第三方脚本”是没有得到应有的提及。值得庆幸的是,大多数广告提供商和CDN托管的图书馆都是由合理可靠的人员提供的。


你知道克服缺少访问控制允许来源

  • 配置服务器,以便没有丢失它的问题的简单方法。
  • 使用JSONP代替
  • 使用未被相同原始策略阻止的代理来取回数据(您不会获得浏览器可能发送的任何凭据,因为Alice拥有Bob的帐户)。
+2

“CORS服务器告诉浏览器它可以放松其正常的安全性,因为数据不需要这样的保护水平” - 这使得所有的东西都放在它的位置上。感谢您的明确解释 – Dan 2014-12-07 21:20:35

+0

据我了解,试图从马洛里的网站向Bob发出请求,使用' Dan 2014-12-07 21:48:30

+1

Yes. There are even limits on how much information gets passed into 'load' and 'error' events when an ''指向另一个来源。 – Quentin 2014-12-07 22:48:55