zoukankan      html  css  js  c++  java
  • Django---csrf_token

    1、csrf_token的作用

    django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。

    2、设置csrf_token

    对于django中设置防跨站请求伪造功能有分为全局和局部。

    (1)全局

    settings.py文件中:

    MIDDLEWARE=[
      ......
      django.middleware.csrf.CsrfViewMiddleware
    ]

    若要取消csrf认证,就将该行注释掉即可(用postman模拟post请求时,需要将该行注释掉)

    (2)局部

    ① FBV模式:

    from django.views.decorators.csrf import csrf_exempt,csrf_protect

    @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。

    @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

    只需要在函数前加上相应的装饰器即可

    ② CBV模式:

      第一种方式:

      在dispatch方法前加装饰器@method_decorator(csrf_exempt)或@method_decorator(csrf_protect)

    class StudentsView(View):
        @method_decorator(csrf_exempt)
        def dispatch(self, request, *args, **kwargs):
            return super(StudentsView,self).dispatch(request,*args, **kwargs)
    
        def get(self,request,*args,**kwargs):
            return HttpResponse('GET')
    
        def post(self,request,*args,**kwargs):
            return HttpResponse('POST')
    
        def delete(self,request,*args,**kwargs):
            return HttpResponse('DELETE')

     

      第二种方式:

      在类前面加装饰器@method_decorator(csrf_exempt,name='dispatch')或@method_decorator(csrf_protect,name='dispatch')

    @method_decorator(csrf_exempt,name='dispatch')
    class StudentsView(View):
        def get(self,request,*args,**kwargs):
            return HttpResponse('GET')
    
        def post(self,request,*args,**kwargs):
            return HttpResponse('POST')
    
        def delete(self,request,*args,**kwargs):
            return HttpResponse('DELETE')

     

    3、原理

    在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值。当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性。当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御,这样就能避免被 CSRF 攻击。


    csrf在ajax提交的时候通过请求头传递的给后台的;csrf在前端的key为:X-CSRFtoken,到后端的时候django会自动添加HTTP_,最后为HTTP_X_CSRFtoken
    csrf在form中提交的时需要在前端form中添加{%csrftoken%},form中会自动生成一个隐藏的input

     

  • 相关阅读:
    每天一个linux命令(5):rm 命令
    每天一个linux命令(3):pwd命令
    c++11之lambda表达式
    C++11之std::future和std::promise和std::std::packaged_task
    金三银四,为什么面试你总拿不到高薪?
    高并发神器 Nginx,到底该怎么学?
    好文 | MySQL 索引B+树原理,以及建索引的几大原则
    为什么 TCP 建立连接是三次握手,关闭连接确是四次挥手呢?
    Java & 架构硬核福利,速度上车!
    Intellij IDEA 阅读源码的 4 个绝技,我必须分享给你!
  • 原文地址:https://www.cnblogs.com/sjx6688/p/10059379.html
Copyright © 2011-2022 走看看