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

Dan*_*Dan 1 javascript security ajax cross-domain cors

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

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

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

3)在仍然可以使用jsonp的同时阻止XMLHttpRequests的用途是什么?

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

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

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

Que*_*tin 7

我从来没有听说过服务器试图限制外来网页的访问.

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

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的帐户).

  • "CORS是告诉浏览器它可以放松其正常安全性的服务器,因为数据不需要那种级别的保护" - 这将所有内容放在其位置上.谢谢你的明确解释 (2认同)