django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性。具体来讲,可以这样理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
Django中默认中间件会有csrftoken的
django.middleware.csrf.CsrfViewMiddleware
1 原理
当用post提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会报错,这也是之前我们一直将其注释的原因,错误如
2 基本使用
- form表单
在表单中直接添加{% csrf_token%}
,放在请求体中
<form ...> {% csrf_token %} <input type='hidden' value='xxxxxxxx' /> <input ... /> <input type='submit' /> </form>
- ajax方式
放在请求头中,通过jquery发送
$.ajax({ url: '/csrf_test/', method: 'post', headers:{'X-CSRFToken':'token值'}, // 注意放到引号里面 data:{} }
3.免除csrftoken
- 在视图函数上面加上装饰器
from django.views.decorators.csrf import csrf_exempt,csrf_protect @csrf_exempt def 函数名(request): # 加上装饰器后,这个视图函数,就没有csrf校验了 pass
- 在视图类上加上装饰器
from django.utils.decorators import method_decorator @method_decorator(csrf_exempt,name='dispatch') class index(View): def get(self,request): return HttpResponse("GET") def post(self,request): return HttpResponse("POST")