跨站点 XMLHTTPRequest 是否会 re-use 凭据?

Will a cross site XMLHTTPRequest ever re-use credentials?

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

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

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

获得积分

只要你没有 Access-Control-Allow-Credentials response header set, it will not allow authorisation for API requests that read data (the request will still be made, although the response cannot be read by the other domain due to the Same Origin Policy).

您仍然应该实施 CSRF protection for methods that have consequences - i.e. make changes to your system, that are not considered safe。 CSRF 是恶意站点可以发出跨站点请求,然后重用来自浏览器的用户凭据的地方。

我也建议不要设置

Access-Control-Allow-Origin: *

您仅将此 header 设置为您 API 的允许消费者。例如,在 AJAX 请求中,将发送 Origin header:

Origin: https://example.com

收到此请求后,您应该在 back-end 数据库中检查 https://example.com 是否为授权消费者。如果是这样,你会输出这个 header 而不是:

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

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