CSRF是什么
CSRF(Cross Site Request Forgery):跨站请求伪造,实现的原 理是CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻 击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网 站发起伪造用户操作的请求,达到攻击目的。

Django CSRF工作原理
Django怎么验证一个请求是不是CSRF?
Django处理客户端请求时,会生成一个随机Token,放到响应内容一起返回,然后需要前端每次POST请求时带上这 个Token,可以放到POST数据里键为csrfmiddlewaretoken,或者放到请求头键为X-CSRFToken,Django从这两个 位置取,每次处理都会拦截验证,通过比对两者是否一致来判断这个请求是不是非法,非法就返回403状态码。
使用CSRF防护机制
常见有三种方法可以携带CSRF Token发送给服务端:
- from表单添加{% csrf_token %}标签,表单会携带一同提交
- 如果你是Ajax请求,需要把csrf token字符串(也是通过拿{% csrf_token %}标签产生的值)放到data里一起提交, 并且键名为csrfmiddlewaretoken或者放到请求头传递服务端
- 指定取消某函数视图CSRF防护
|

方式1: <form method="post"> {% csrf_token %} 用户名: <input type="text" name="username"><br> 密码: <input type="text" name="password"><br> <button type="submit">登录</button> </form>
|
方式2: var csrf_token = $("[name='csrfmiddlewaretoken']").val(); var data = {'id': '123', 'csrfmiddlewaretoken': csrf_token}; $.ajax({ type: "POST", url: "/api", data: data, dataType: 'json' })
|
方式3: from django.views.decorators.csrf import csrf_exempt @csrf_exempt def index(request): return render(request, 'index.html')
|