我了解header的目的Access-Control-Allow-Credentials
,但看不到Access-Control-Allow-Origin
header 解决了什么问题。
更准确地说,很容易看出,如果默认情况下允许使用凭据的跨域 AJAX 请求,或者如果某些服务器在每个请求上都吐出Access-Control-Allow-Credentials
标头,那么 CSRF 攻击将成为可能,否则无法执行。这种情况下的攻击方法很简单:
- 将毫无戒心的用户引诱到我的恶意页面。
- 我的恶意页面上的 JavaScript 向目标站点的某些页面发送 AJAX 请求(带有cookie)。
- 我的恶意页面上的 JavaScript 解析对 AJAX 请求的响应,并从中提取 CSRF 令牌。
- 我的恶意页面上的 JavaScript 使用任何方式 - AJAX 或用于 CSRF 请求的传统容器,如表单 POST - 使用用户的 cookie 和他们被盗的 CSRF 令牌的组合来执行操作。
但是,我看不到的是不允许没有标头的未经认证的跨域 AJAX 请求的目的是什么Access-Control-Allow-Origin
。假设我要创建一个浏览器,它的行为就好像它收到的每个 HTTP 响应都包含
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials
但在使用跨域 AJAX 请求发送 cookie 之前仍需要适当的标头。
由于 CSRF 令牌必须绑定到单个用户(即单个会话 cookie),因此对未经认证的 AJAX 请求的响应不会暴露任何 CSRF 令牌。那么,上述假设的浏览器会将其用户暴露于何种攻击方法(如果有的话)?