谨以此博客记录我今天踩的坑,AJAX的请求基本上与CSRF无缘了!!!(那为什么又有人说防csrf的方法之一是为XMLHttpRequest设置一个CSRFToken的头信息呢? )
为什么说基本上呢?有两个原因:
1.服务器配置原因,X-Requested-With: XMLHttpRequest在跨域请求中一般都会被去掉,貌似配置了的话就另说了
2.本人很菜,如果有大佬有很骚很骚的操作绕过的话另说了,同时请大佬也教教我,菊花献上!!!感谢
简单说下原因吧,其实今天花了几乎一下午的时间搞这个,其中的辛酸之后自己知道,最后才发现其实不成功的原因很简单,CSRF叫跨站点请求伪造,一般我们验证的csrf时说白了都是在跨域!
而服务器判断请求时AJAX请求还是传统请求时,一般都是根据请求头中是否有X-Requested-With: XMLHttpRequest,有该头信息就是ajax请求
而跨域的时候会自动将该头信息删除掉
所以两者相矛盾
我先尝试手动加该头信息:xhr.setRequestHeader(
"X-Requested-With"
,
"XMLHttpRequest"
);
发现请求之前会先发送一个OPTIONS的预请求,而预请求中是不让又这个头信息的!!!
于是我又尝试JSONP的方式,发现不成功,开始只是觉得是因为jsonp只能发送post请求,如果后台以get请求接收应该就可以了。
这才发现我很是天(la)真(ji)
jsonp根本就不会带上该请求头。。
算了不浪费时间了。。。
前车之鉴,后车之师!!!!
原文地址:https://www.cnblogs.com/jinqi520/p/9924615.html
时间: 2024-10-18 17:59:29