Django 11

8764 단어
카탈로그
  • 기능 구성 설계
  • 크로스 스테이션에서 CSRF 위조 요청
  • CSRF
  • 란?
  • CSRF
  • CSRF
  • 를 피하는 방법
  • CSRF 관련 장식기 2개
  • auth 모듈
  • 일반적인 방법
  • 확장 auth사용자 테이블의 필드

  • 기능 구성 설계
  • 유사한django에서settings를 실현한다.py의 중간부품의 문자열은 특정한 문자열을 주석하여 해당하는 기능을 무효화시킨다
  • importlib 모듈
  • #                     
    import importlib
    path_str = 'lib.test'
    mod = importlib.import_module(path_str)  # from lib import test
    '''
        
    notify
        __init__.py
        email.py
        msg.py
        wechat.py
    settings.py
    start.py    
    '''
    # __init__.py
    import settings
    import importlib
    
    
    def send_all(content):
        for path_str in settings.NOTIFY_LIST:
            module_path, class_name = path_str.rsplit('.', maxsplit=1)
            #       
            mod = importlib.import_module(module_path)  # from notify import email/msg/wechat
            #              
            cls = getattr(mod, class_name)
            #      
            obj = cls(content)
            #      (      ,         ,   send  )
            obj.send()
    
    # email.py
    class Email(object):
        def __init__(self, content):
            self.content = content
    
        def send(self):
            print(f'    :{self.content}')
            
    # msg.py
    class Msg(object):
        def __init__(self, content):
            self.content = content
    
        def send(self):
            print(f'    :{self.content}')
            
       
    # wechat.py
    class WeChat(object):
        def __init__(self, content):
            self.content = content
    
        def send(self):
            print(f'    :{self.content}')
    
    
    
    # settings.py 
    NOTIFY_LIST = [
        'notify.email.Email',
        'notify.msg.Msg',
        'notify.wechat.WeChat',
    ]
    
    # start.py
    from notify import *
    
    if __name__ == '__main__':
        send_all('         ,      ')
        
        
    '''
        :         ,      
        :         ,      
        :         ,      
    '''

    여러 사이트에서 CSRF 위조 요청
    CSRF 소개
    크로스 스테이션이 위조를 요청하는 것은 무엇입니까?간단한 낚시 사이트의 예를 들다
    우리는 모 은행의 페이지를 대조하여 똑같은 페이지를 쓴 후에 사용자를 우리 페이지에 낚아 이체 조작을 했다
    사용자 이름, 비밀번호, 상대방 계정, 그리고 이체 금액을 입력하여 제출
    그리고 저희가 미리 작성한 코드를 이용해서'상대방 계좌'를 저희 계좌로 바꿨어요.
    그리고 나서 요청을 모 은행의 원래 페이지에 대응하는 인터페이스에 제출한다
    이렇게 해서 사용자는 묵묵히 돈을 우리 계좌로 이체하였다.
  • 는 특정한 사이트 페이지가 백엔드에 데이터를 제출하는 형식을 본떠서 백엔드에 요청을 하는 것이다
  • CSRF
  • 사용자가'상대방 계정'의 input 탭을 입력하고name 속성을 설정하지 않기 때문에 백엔드에서 대응하는 데이터를 얻을 수 없음
  • 숨겨진 input 탭을 이용하여name 속성을 설정합니다. 기본값은 저희 계정
  • 입니다.
  • 이렇게 하면 백엔드에서 input 탭이 가지고 있는 값을 숨길 수 밖에 없어요
  • {#           #}
    form action="http://127.0.0.1:8000/transfer/" method="post">
        

    username

    {# , name #}

    target_account

    {# , name #}

    money


    CSRF 예방 방법
  • 해결 방향: 자신의 홈페이지에서 보내는post 요청만 처리--->post 요청이 자신의 홈페이지에서 왔는지 확인하는 방법--->html 페이지로 돌아오는form표에 숨겨진 input 상자를 추가하고 랜덤 문자열을 휴대하는 방법---> 백엔드 중간부품은 이 랜덤 문자열을 통해 본 사이트에서 보낸 요청인지 판단하는 방법
  • form표
  • {#   form      {% csrf_token %}   #}
    
    {% csrf_token %}

    username

    target_account

    money

    {# , input #}
  • ajax
  • {#   :            ajax      data    #}
    {% csrf_token %}
    
        $('#d1').click(function () {
            $.ajax({
                url: '',
                type: 'post',
                
                //   :      name                 
                data:{'username':'bigb', 'csrfmiddlewaretoken':$('input[name='csrfmiddlewaretoken']').val()}
                
                 //   : 'csrfmiddlewaretoken':'{{ csrf_token }}'
                data:{'username':'bigb', 'csrfmiddlewaretoken':'{{ csrf_token }}'}
                success: function (data) {   
                }
            })
        })
    
    
    {#   :            js   ,   html      #}
    //  
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    var csrftoken = getCookie('csrftoken');
    
     //  
     function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            }
        }
    });

    CSRF 관련 두 개의 장식기
  • 가져오기: from django.views.decorators.csrf import csrf_exempt, csrf_protect
  • csrf_exempt: 이 보기 함수에 대응하는 페이지는 csrf 검사를 하지 않습니다
  • csrf_protect: 이 보기 함수에 대응하는 페이지를 csrf 검사
  • from django.views.decorators.csrf import csrf_exempt, csrf_protect
    
    @csrf_exempt  #    
    def index(request):
        return HttpResponse('index')
    
    @csrf_protect  #   
    def index(request):
        return HttpResponse('index')
  • CBV에 이 두 장치를 탑재한다
  • csrf_exempt는 디스패치 방법에만 적용됩니다
  • csrf_보호는 어떻게 장착해도 됩니다
  • from django.views.decorators.csrf import csrf_exempt, csrf_protect
    
    class MyIndex(views.View):
        @method_decorator(csrf_exempt)  # csrf_exempt   dispatch       
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request, *args, **kwargs)
        
        def get(self, request):
            renturn render(request, 'index.html')
            
        @method_decorator(csrf_protect)  # csrf_protect            
        def post(self, request):
            return HttpResponse('index')

    auth 모듈
    상용 방법
  • 관리자 만들기
  • #      : python manage.py makesuperuser
  • 일반적인 방법
  • # 1.    (  )
        #     
            from django.contrib.auth.models import User
        #        creatr_user
            User.objects.create_user(username=username, password=password)
        #         creater_superuser
            User.objects.create_superuser(username=username, password=password, email=email)
     
    
    # 2.            (  )
        #     
            from django.contrib import auth
        #     username password,       
             user_obj = auth.authenticate(request, username=username, password=password)
                if user_obj:
                    return HttpResponse('    !')
                else:
                    return HttpResponse('       !')
            
    # 3.      (session)
        #       ,         request.user            
            auth.login(request, user_obj)
        
    # 4.        
        request.user.is_authenticated()
        
    # 5.         (             ) 
        request.user.check_password(old_password)
        
    # 6.    
        request.user.set_password(new_password)
        
    # 7.  
        auth.logout(request)
        
    # 8.        
        #     
            from django.contrib.auth.decorators import login_required
        #         
            @login_required(login_url='/login/')
            def index(request):
                return HttpRespone('index')
        #           
            #  settings.py   
            LOGIN_URL = /'login'/
            
            @login_required
            def index(request):
                return HttpRespone('index')      

    확장 auth사용자 테이블의 필드
    # 1.            
        class UserDetail(models.Model):
            phone = models.CharField(max_length=11)
            addr = models.CharField(max_length=255)
            
            user = models.OneToOneField(to='User')
            
            
    # 2.              ,       User 
        from django.contrib.auth.models import AbstractUser
        
        #    AbstracterUser      
        class UserInfo(AbstractUser):  
        #     
        phone = models.CharField(max_length=11)
        addr = models.CharField(max_length=255)
        
        #    settigs.py        UserInfo
        AUTH_USER_MODEL = 'app01.Userinfo'  #    .  

    좋은 웹페이지 즐겨찾기