通过Ajax预防CSRF
除了上述方法,还可以通过Ajax来和服务器通信来减少CSRF的风险。这时候可以考虑在请求的header里加入页面信息来做合法性验证。比如参考如下代码:
1
2
3
4
5
6
7
8
9
10
11
|
functionpost(){
varxhr =newXMLHttpRequest();
xhr.open("POST","/create",true);
…….
// 在xhr.open方法后,进行header设置。
xhr.setRequestHeader("X-From", location.href );
……
xhr.send( s );
returnfalse;
}
服务器端在接收到客户端的请求后,会进行如下处理:
如果请求满足了所有这些条件,都可以认为是正常的访问。 如果攻击者如果直接通过假页面提交Form,则不能在header里设置X-From属性;而如果攻击者也用Ajax提交,则header里的Origin因为不能伪造,也不能达到攻击的目的。从而达到了预防CSRF的目的。 |