了解CORS安全性:允许浏览器跨域访问的服务器的用途是什么?

时间:2014-12-07 20:49:37

标签: javascript ajax security cross-domain cors

我刚刚发现,为了允许跨域AJAX调用,应在SERVER端设置Access-Control-Allow-Origin标头。这对我来说很沮丧,让我解释一下原因:

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

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

3)当你仍然可以使用jsonp时,阻止XMLHttpRequests的用途是什么?

你能解释一下为什么这样做吗?

对于那些仍在阅读的人来说,还有一个额外的问题:

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

1 个答案:

答案 0 :(得分:6)

  

我从未听说过服务器试图限制外来网页的访问权限。

同源策略是由浏览器而非服务器强加的限制。

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


  

即使服务器想要限制来自其他域的连接,也不可能使用HTTP协议的功能来实现这一点。

这就是为什么没有使用HTTP协议的原因。

  

我建议使用令牌。

使用随机数来防止CSRF解决了另一个问题。

这是一个相对昂贵的解决方案,您只需要在可能有问题的请求的副作用(例如“发布新评论”)时退出,而不是将数据传递回在另一个站点上运行的JavaScript

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


  

在仍然可以使用jsonp的情况下阻止XMLHttpRequests有什么用?

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

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

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


  

你能解释一下为什么这样做吗?

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

考虑这种情况:

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

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

如果没有相同的原始政策,Alice可能(登录Bob的网站时)访问Mallory的网站。没有Alice的知识或许可,Mallory的网站将JavaScript发送到Alice的浏览器,该浏览器使用Ajax从Bob的站点获取数据。由于它来自Alice的浏览器,所有Alice的私人信息都被提供给JavaScript。然后,JavaScript将其发送到Mallory。

这显然不是一件好事。

同源政策阻止了这一点。

如果Bob作为运行该站点的人,决定该信息不是机密信息并且可以公开共享,那么他可以使用CORS或JSONP来访问其他站点上运行的JavaScript。


  

您是否知道如何阻止来自网页的任何跨域请求。

没有。该网页是一个单一的实体。试图从其他部分对其部分进行警察是一件愚蠢的事。

  

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

“小心信任第三方脚本”是不应该被提及的东西。值得庆幸的是,大多数广告提供商和CDN托管库都是由相当值得信赖的人提供的。


  

您是否知道一种简单的方法来克服缺少Access-Control-Allow-Origin

的问题
  • 配置服务器,使其不会丢失。
  • 使用JSONP
  • 使用未被同一原始策略阻止的代理来获取数据(您不会获得浏览器可能发送的任何凭据,因为Alice虽然拥有Bob的帐户)。