【问题标题】:Will a cross site XMLHTTPRequest ever re-use credentials?跨站点 XMLHTTPRequest 会重复使用凭据吗?
【发布时间】:2015-04-24 22:40:36
【问题描述】:

有一个具有 JSON API 的开源守护程序。此守护进程强制使用基本 HTTP 身份验证。我正在考虑提交 PR 以始终发送 Access-Control-Allow-Origin: * 标头以允许 API 被其他网页使用,但我想确保它不会带来安全风险。

如果用户登录到 API,我知道来自同一域的 AJAX 请求会自动获取 HTTP Authorization 标头。根据我的测试,如果请求来自另一个域,则永远不会出现这种情况。

所有浏览器都是这样实现它的吗?我是否更正了恶意网站无法对 API 执行请求,除非它知道您的信誉,并且不可能(除了浏览器漏洞利用)通过以下方式获取信誉JavaScript?

【问题讨论】:

  • 如果您将授权标头添加到允许的标头列表中,是否会发送它? Access-Control-Allow-Headers: Authorization
  • 即使启用了我的浏览器也不会发送凭据,所以我认为它是安全的

标签: javascript xmlhttprequest csrf basic-authentication


【解决方案1】:

只要你没有设置Access-Control-Allow-Credentials响应头,它就不允许对读取数据的API请求进行授权(请求仍然会发出,虽然响应不能被其他域读取,因为Same Origin Policy)。

您仍然应该为具有后果的方法实施CSRF 保护 - 即对您的系统进行更改,这不被视为safe。 CSRF 是恶意站点可以发出跨站点请求然后重用来自浏览器的用户凭据的地方。

我也建议不要设置

Access-Control-Allow-Origin: *

您只需将此标头设置为您的 API 的允许使用者。例如,在 AJAX 请求中,将发送 Origin 标头:

Origin: https://example.com

当您收到此请求时,您应该在您的后端数据库中检查https://example.com 是授权消费者。如果是这样,您将改为输出此标头:

Access-Control-Allow-Origin: https://example.com

这将防止 evil.com 由于您的 CORS 实施而被允许绕过同源策略。如前所述,在您的测试中,当您通过 JavaScript 手动添加 Authorization 标头时,它似乎没有被浏览器缓存,但是并非所有浏览器都被平等地创建,采取这些额外的步骤将是一个很好的安全预防措施。

【讨论】:

  • 是的,如果我只允许 Authorization 标头,我可以使用 JavaScript 手动设置标头。我没有发现任何安全问题。
  • 添加 CSRF 保护可能是个好主意,以防浏览器以不同方式处理。
猜你喜欢
  • 2015-09-29
  • 2010-09-28
  • 1970-01-01
  • 2011-02-04
  • 2010-09-28
  • 2014-03-18
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多