zoukankan      html  css  js  c++  java
  • Django之CSRF问题

    1、csrf全称:cross site request forgery(跨站请求伪造),举例来讲,一个安全的网站A,一个恶意网站B,当你在A网站进行了登录后,这时候浏览器会保存你的cookie和session相关信息,然后,当你访问B网站时,你点击了一个指向A网站的链接,这个链接就会带着你的cookie和session向A发送请求,就可能造成无法想象的后果了。

    2、防止这一攻击的方式一般有两种:一种是Challenge-Response的方式,例如通过Captcha和重新输入密码等方式来验证请求是否伪造,但这会影响用户体验,类似银行付款会采用这样的方式。另一种是通过随机Token的方式,多数Web系统都会采用这种方式。django采用的就是这种方式。

    3、django会在用户提交的表单里添加一个csrftoken隐含值,使用这一方式的具体原理如下:

      1)在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,其值是在服务器端随机生成的,每一次提交表单后又会生成不同的值;

      2)当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性;

      3)当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御;

    4、csrf装饰器的使用

    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    # @csrf_protect #需要走csrf验证
    # @csrf_exempt  #不需要走csrf验证
    
    # 给CBV加装饰器
    from django.views import View
    from django.utils.decorators import method_decorator
    
    # 方式一:使用method_decorator
    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):
            print('get方法')
            return HttpResponse('GET')
    
        def post(self, request, *args, **kwargs):
            return HttpResponse('POST')
    
    
    #方式二:给类加装饰器,name标明要装饰的函数
    @method_decorator(csrf_exempt,name='dispatch')
    class ClassView(View):
    
        def dispatch(self, request, *args, **kwargs):
            return super(ClassView, self).dispatch(request, *args, **kwargs)
    
        def get(self, request, *args, **kwargs):
            print('get方法')
            return HttpResponse('GET')
    
        def post(self, request, *args, **kwargs):
            return HttpResponse('POST')
  • 相关阅读:
    ubuntu20.04上实现百度Apollo6.0系统的部署
    matplotlib包图例出现中文乱码问题
    微软官方Silverlight 音频播放器 Jonas修整版(silerlight 2.0版)
    SpringCloud总结1
    Java中文长度计算
    注册退出函数:atexit
    函数参数的一种特殊用法
    new与malloc等的区别
    两种多态
    第一章 1.1.2 因特网提供服务的方式
  • 原文地址:https://www.cnblogs.com/value-code/p/8510414.html
Copyright © 2011-2022 走看看