CSRF(跨站请求伪造)
背景知识:浏览器在发送请求的时候,会自动带上当前域名对应的cookie内容,发送给服务端,不管这个请求是来源A网站还是其它网站,只要请求的是A网站的链接,就会带上A网站的cookie。浏览器的同源策略并不能阻止CSRF攻击,因为浏览器不会停止js发送请求到服务端,只是在必要的时候拦截了响应的内容。或者说浏览器收到响应之前它不知道该不该拒绝。
攻击过程:
假设abc用户登录银行的网站进行操作, 同时也访问了攻击者预先设置好的网站。
abc点击了攻击者网站的某一个链接,这个链接是http://www.bank.com/xxxx指向银行,银行服务器会根据这个链接携带的参数会进行转账操作。
银行服务器在执行转账操作之前会进行SESSION验证是否登录, 但是由于abc已经登录了银行网站,攻击者的链接也是www.bank.com.所以攻击的链接就会携带session id到银行服务器。
由于session id是正确的,所以银行会判断操作是由本人发起的,执行转账操作。
django 表单
<form> {% csrf_token %} <input type="password" name="password" value=""> </form>
ajax请求
模板文件方式
$.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); $.ajax({ type:"POST", url:"/basic/verifycode/", datatype:"json", data:{ "tel_phone":$("#tel_phone").val(), "captcha":$("#captcha").val(), }, async:true, success:function(result){ }, error:function(result){ } });
ajax自带
var csrftoken = $("input[name$='csrfmiddlewaretoken']").val(); $.ajax({ type:"POST", url:"/basic/verifycode/", datatype:"json", data:{ "tel_phone":$("#tel_phone").val(), "captcha":$("#captcha").val(), }, headers:{'X-CSRFToken':csrftoken }, async:true, success:function(result){ var s = eval(result); var msg = s.msg; console.log(msg); }, error:function(result){ } });