今天在研究CSRF,发现了下面这句话:
自定义 HTTP 标头可用于防止 CSRF,因为浏览器 阻止网站将自定义 HTTP 标头发送到另一个网站,但 允许网站向自己发送自定义 HTTP 标头
有人可以向我更好地解释这个概念并告诉我这句话是否正确吗?
我是否可以假设,如果我在自定义 HTTP 标头内发送 CSRF 令牌,攻击者就无法做到这一点?
有人可以向我更好地解释这个概念并告诉我这句话是否正确吗?
这句话是正确的,因为实现 CORS 协议的现代浏览器将拒绝发出由外部(“跨源”)网页发起的请求,并且这些请求超出了简单单击超链接或提交一个HTML表单就可以实现。例如,如果此类请求包含
X-Requested-With: XMLHttpRequest
标头,他们就会拒绝此类请求。如果服务器只接受带有这样的 X-Requested-With
标头(或其他非标准标头)的请求,这可以用来防御 CSRF。那么就可以确定它们不是由不同的产地制成的。
如果请求的目标声明外部网页值得信赖(通过
preflight响应中的
Access-Control-Allow-*
标头),仍然会发出此类跨源请求。
但是“简单”请求仍然需要 CSRF 令牌,例如通过提交 HTML 表单发起的请求。这些请求不能包含非标准标头,因此必须在(隐藏)表单字段中传输 CSRF 令牌。
我是否可以假设,如果我在自定义 HTTP 标头内发送 CSRF 令牌,攻击者就无法做到这一点?
请参阅此说明。