javascript - 了解 CORS 安全性 : what's the use of server allowing browser cross-domain access?

标签 javascript ajax security cross-domain cors

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

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

2) 即使服务器想要限制来自其他域的连接,使用 HTTP 协议(protocol)的能力是不可能做到这一点的。我建议为此使用 token 。

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

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

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

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

最佳答案

I have never heard of a server trying to restrict access from alien webpages.



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

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

Even if server wanted to restrict connections from other domains, it's impossible to do this using capabilities of HTTP protocol.



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

I suggest using tokens for that.



使用 nonce 来防止 CSRF 解决了一个不同的问题。

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

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

What's the use of blocking XMLHttpRequests while you still can use jsonp?



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

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

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

Can you explain why is this done that way?



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

考虑这种情况:

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

马洛里有另一个网站。它使用 Ajax 尝试访问 Bob 的站点。

如果没有同源策略,Alice 可能(在登录 Bob 的网站时)访问 Mallory 的网站。在 Alice 不知情或未经许可的情况下,Mallory 的网站将 JavaScript 发送到 Alice 的浏览器,该浏览器使用 Ajax 从 Bob 的网站获取数据。因为它来自 Alice 的浏览器,所以 Alice 的所有私有(private)信息都被提供给 JavaScript。然后 JavaScript 将其发送给 Mallory。

这显然不是一件好事。

同源策略可以防止这种情况。

如果 Bob 作为网站的运营者,认为信息不是 secret 的并且可以公开共享,那么他可以使用 CORS 或 JSONP 来提供对其他网站上运行的 JavaScript 的访问权限。

Do you know a way to prevent any cross-domain request from a webpage.



不,网页是一个单一的实体。试图从其他部分监管它的一部分是愚蠢的差事。

Imagine a junior web developer creating a login form on a page having ads or other scripts potentially sniffing passwords? Isn't this the essence of web security? Why anyone is talking about that?



“小心信任第三方脚本”这一点并没有得到应有的提及。值得庆幸的是,大多数广告提供商和 CDN 托管库都是由相当值得信赖的人提供的。

Do you know an easy way of overcoming the problem of missing Access-Control-Allow-Origin


  • 配置服务器,使其不会丢失。
  • 改用 JSONP
  • 使用未被同源策略阻止的代理来获取数据(您将不会获得浏览器可能发送的任何凭据,因为 Alice 拥有 Bob 的帐户)。
  • 关于javascript - 了解 CORS 安全性 : what's the use of server allowing browser cross-domain access?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27347656/

    相关文章:

    javascript - Angular 在 hashbang 之后替换 url

    javascript - 如何强制 jQuery 插件刷新它加载的数据?

    javascript - Youtube Search js函数

    sql-server - 如何在 SQL Server 2008 R2 中检查用户是否具有系统管理员权限

    Java Web Start - 未知发布者运行的应用程序将被阻止 - 文件 list 不包含权限

    javascript - D3 鼠标悬停转换获取 "stuck"

    java - RichFaces 3.3 : Calling actionListener on window. 加载

    javascript - 在同一 Canvas 上绘制 gl.POINTS 和 gl.TRIANGLES

    javascript - Access-Control-Allow-Origin 不允许来源

    security - 身份验证系统 - 我的安全吗?