【问题标题】:Is it safe to allow cross-domain access to all API resources?允许跨域访问所有 API 资源是否安全?
【发布时间】:2012-08-26 03:39:36
【问题描述】:

对 API 资源的访问可能需要经过身份验证

  1. 可以由 Web 浏览器自动发送但不会跨域发送的凭据,除非 Access-Control-Allow-Credentials 设置为“true”(例如 cookie、HTTP Basic/Digest 身份验证、SSL 证书)。

  2. 必须由客户端手动设置的秘密令牌,无论是在 HTTP 标头中还是作为 URL 中的查询参数(例如 OAuth 访问令牌)。

考虑到这一点,在 API 中的所有资源上设置“Access-Control-Allow-Origin: *”总是安全的吗?

【问题讨论】:

  • 本质上,问题是“如果 API 仅在 HTTP 标头中使用 OAuth 进行身份验证,那么在所有资源上设置 'Access-Control-Allow-Origin: *' 是否安全?”
  • 一个必然的问题是“为什么网络浏览器不允许跨域访问所有资源,只要不发送凭据?”

标签: security api http authentication cors


【解决方案1】:

如果在任何时候攻击者在他控制的域上执行 JavaScript 可以在不提供令牌的情况下获取数据或执行状态更改,那么您就有了漏洞。该攻击与CSRF 非常相似,只是它拓宽了数据过滤的范围。

但就像 CSRF 一样,如果客户端必须为每个请求使用一个令牌进行身份验证,而攻击者不知道这个令牌,那么他就无法通过类似 CSRF 的攻击访问CORS API。

【讨论】:

  • 假设没有凭据的唯一可能操作是读取公共数据(应该如此),这是否意味着没有漏洞?如果只启用“Access-Control-Allow-Origin: *”,就无法跨域发送凭据?
  • @Alf Eaton 你可以在没有 CORS 的情况下发送数据,这就是 CSRF 攻击背后的全部想法。 CORS 允许您读取数据,如果攻击者不知道密钥(并且密钥不是 cookie),那么他仍然无法读取该数据。
  • 您可以在没有 CORS 的情况下发送数据,但不能在没有凭据的情况下发送;只要保证不会自动发送凭据,这意味着为所有资源启用 CORS 标头是安全的。
  • @alf Eaton 这取决于凭据的发送方式,如果攻击者知道它们在哪里,他可能会发送它们...如果它是 cookie 甚至基本身份验证,则可以自动发送,那么攻击者就不需要知道它们了。
猜你喜欢
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2013-10-19
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 2016-11-02
相关资源
最近更新 更多