Django(30)csrftoken(跨站请求伪造)

CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作,具有很大的危害性。
token其实就是一个令牌,用于用户验证的,token的诞生离不开CSRF。
正是由于上面的Cookie/Session的状态保持方式会出现CSRF,所以才有了token。

  • 无csrf_token数据的post请求

  • 解除中间件注释

    解除中间件只是治标不治本
    1,form表单提交
    在html页面form表单中直接添加{% csrf_token%}

    2,ajax提交
    2.1,放在请求数据中。

$.ajax({
  url: '/csrf_test/',
  method: 'post',
  data: {'name': $('[name="name"]').val(),
         'password': $('[name="password"]').val(),
         'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()           
        },
  success: function (data) {
    console.log('成功了')
    console.log(data)           },
})

$('#regForm').serialize()
用ajax发请求可以通过serialize()直接拿到所有数据

 <form id="regForm" method="POST" novalidate>
            {% csrf_token %}
$.ajax({
                    url: "{% url 'register' %}",
                    type: "POST",
                    data: $('#regForm').serialize(), // 所有字段数据 + csrf token
                    dataType: "JSON",

2.2,放在请求头

$.ajax({
            url: '/csrf_test/',
            method: 'post',
            headers:{'X-CSRFToken':$.cookie('csrftoken'},  // 自定制请求头,注意放到引号里面
            // {'X-CSRFToken':localStorage.getItem("token")
            data:{}
}

3,全局使用,局部禁csrf

from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def 函数名(request):  # 加上装饰器后,这个视图函数,就没有csrf校验了
from django.views.decorators.csrf import csrf_exempt,csrf_protect
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")
posted @ 2021-12-06 00:04  下个ID见  阅读(62)  评论(0)    收藏  举报