CSRF(Cross Site Request Forgery protection),中文简称跨站请求伪造。django中对POST请求,csrf会进行认证处理,csrf认证机制是防御跨站伪造功能,在没有任何处理的前提下,POST请求会报错。
Django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击。
例子如下:
login.html页面:
浏览器访问之后的网页源代码:
有一个默认隐藏起来的input框,其中有value值,会跟随用户提交的数据一起到达服务器。Django会在数据到达之后,在内部读取这个隐藏起来的value。用来校验这个请求是不是我们的网页。如果不是,就当作非法请求。
官方文档中说到,检验token时,只比较secret是否和cookie中的secret值一样,而不是比较整个token。
源码中,token字符串的前32位是salt, 后面是加密后的token
例如:
<input type="hidden" name="csrfmiddlewaretoken" value="XmgOYha8SA4FiGlWXweKaDu0dmuJYyB2e0eF3gegFHSW4zMgovNMamWNsV4TwIN1">
salt:XmgOYha8SA4FiGlWXweKaDu0dmuJYyB2
token:e0eF3gegFHSW4zMgovNMamWNsV4TwIN1
salt对应唯一的secret
django会验证表单中的token和cookie中token中的salt是否能解出同样的secret,secret一样则本次请求合法。