CSRF与AJAX

Posted jinqi520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF与AJAX相关的知识,希望对你有一定的参考价值。

谨以此博客记录我今天踩的坑,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根本就不会带上该请求头。。
算了不浪费时间了。。。
 
前车之鉴,后车之师!!!!

以上是关于CSRF与AJAX的主要内容,如果未能解决你的问题,请参考以下文章

六十六:CSRF攻击与防御之CSRF防御之ajax防御和ajax封装

Django与CSRF AJAX

CSRF与AJAX

44. CSRF 攻击与防御

第六章:Django 综合篇 - 17:CSRF与AJAX

第六章:Django 综合篇 - 17:CSRF与AJAX