Access-Control-Allow-Headers标头的重点是什么

时间:2013-08-01 10:53:05

标签: html5 http cross-domain cors

我正在阅读Cross-Origin Resource Sharing标准,有一件事对我没有意义。

假设我想从域A向域B发送请求,包括授权标头。据我了解,域B上的服务器需要通过发送标头Access-Control-Allow-Headers来接受这一点。

这有什么意义?我认为同源策略的目的是保护域B中的数据不会泄漏到域A上的网站。我不知道哪个头部A发送给B的重要性。

2 个答案:

答案 0 :(得分:4)

好的,我想我有一个可能的答案:

服务器B不希望其他网站上的恶意脚本在登录用户的上下文中发送请求。 情况: 所以服务器B说gmail.com已经登录了Foo。

服务器A:malicioussite.com有一个脚本发送xhr到gmail.com查询邮件列表

由于Foo已登录到gmail.com,gmail会识别会话cookie并发送列表。

仅当gmail.com允许交叉来源请求政策时才可以这样做。否则,用户Foo无意中消失的服务器A无法从服务器B(gmail)获取数据。

这不是为了保护托管站点(发送xhr的站点),因为如果站点A故意想要将某些数据发送到服务器B,则没有理由不这样做。如果有一个浏览器脚本/恶意软件从服务器A的页面发送xhr,则数据已经被泄露。

它是如何保护服务器B免受XSS攻击的。

答案 1 :(得分:1)

请注意,预检请求存在的全部原因是为在CORS之前无法执行的请求提供保护。每个简单的请求(例如,不需要预检的请求)都可以使用现有机制完成。例如,没有自定义标头的GET请求类似于JSONP请求,而没有自定义标头的POST请求类似于JavaScript form.submit()。服务器必须已经准备好接收来自其他域的这些类型的请求,因为它们可以在没有CORS的情况下执行。

CORS将服务器引入了一系列新的HTTP方法和标头。为了验证服务器是否准备好回答这些请求,引入了预检的概念。预检验证在将实际请求发送到服务器之前允许HTTP方法/标头的特定组合。

为什么不发送实际请求,只是阻止客户端收到响应?实际请求可能具有与之关联的副作用(例如,更新或删除数据库条目),仅发送请求可能会触发副作用。

发送预检和验证HTTP标头可确保服务器不会对CORS引入的新类型请求感到惊讶。