为什么不在跨源上发送 XSRF 令牌?
Why XSRF token is not being sent on cross-origin?
这是 github 上 Angularjs 1.6.4 中文件 http.js 的片段:
var xsrfValue = urlIsSameOrigin(config.url)
? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName]
: undefined;
if (xsrfValue) {
reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
}
为什么仅当请求来自同一来源时才包含 XSRF 令牌?如果 Restful 后端与前端位于不同的主机上怎么办,难道不应该使用 XSRF 吗?
在这种情况下,XSRF 保护的工作原理是将 config.xsrfHeaderName
header 中收到的令牌与作为 cookie config.xsrfCookieName
收到的令牌进行比较(参见 "double posting" 针对 xsrf 的保护). cookie 无论如何都不会发送到其他来源,因此发送 header.
没有意义
在这种情况下,另一个来源大概使用不依赖于浏览器自动添加到请求中的东西(即 cookie)的身份验证,但可能像大多数 API 一样基于令牌。在这种情况下,它不容易受到 xsrf 的攻击。
这是 github 上 Angularjs 1.6.4 中文件 http.js 的片段:
var xsrfValue = urlIsSameOrigin(config.url)
? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName]
: undefined;
if (xsrfValue) {
reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
}
为什么仅当请求来自同一来源时才包含 XSRF 令牌?如果 Restful 后端与前端位于不同的主机上怎么办,难道不应该使用 XSRF 吗?
在这种情况下,XSRF 保护的工作原理是将 config.xsrfHeaderName
header 中收到的令牌与作为 cookie config.xsrfCookieName
收到的令牌进行比较(参见 "double posting" 针对 xsrf 的保护). cookie 无论如何都不会发送到其他来源,因此发送 header.
在这种情况下,另一个来源大概使用不依赖于浏览器自动添加到请求中的东西(即 cookie)的身份验证,但可能像大多数 API 一样基于令牌。在这种情况下,它不容易受到 xsrf 的攻击。