【问题标题】:Understanding CORS security: what's the use of server allowing browser cross-domain access?了解 CORS 安全性:允许浏览器跨域访问的服务器有什么用?
【发布时间】:2015-02-05 11:57:33
【问题描述】:

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

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

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

3) 阻止 XMLHttpRequests 有什么用,而您仍然可以使用 jsonp?

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

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

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

【问题讨论】:

  • 我相信跨域ajax调用的责任完全在于客户端而不是服务器。服务器如何知道请求是否是跨域的?为什么页面可以向恶意服务器发出请求,而无法请求有人忘记放置Access-Control-Allow-Origin 标头的服务器?
  • "即使服务器想限制来自其他域的连接,使用 HTTP 协议的功能也是不可能的。我建议为此使用令牌。"如果您可以 AJAX 请求任意跨域内容,您可以获得这些令牌。

标签: javascript ajax security cross-domain cors


【解决方案1】:

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

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

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


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

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

我建议为此使用令牌。

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

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

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


在您仍然可以使用 jsonp 的同时阻止 XMLHttpRequests 有什么用?

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

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

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


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

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

考虑这种情况:

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

马洛里有另一个网站。它使用 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 是服务器告诉浏览器它可以放松其正常的安全性,因为数据不需要那种级别的保护” - 这将一切都放在它的位置上。谢谢你的解释清楚
  • 据我了解,尝试使用 <img src="ajax.json" 技术从 Malory 的网站向 Bob 发出请求不会破坏安全性,因为 javascript 无法访问数据。
  • 是的。当<img> 指向不同的来源时,甚至有多少信息被传递到loaderror 事件中。
猜你喜欢
  • 2016-08-09
  • 2015-09-30
  • 2017-01-23
  • 2014-10-13
  • 1970-01-01
  • 2016-06-29
  • 2013-06-23
  • 2012-08-26
  • 2017-11-09
相关资源
最近更新 更多