장고 수필: CSRF 방어

CSRF 가 무엇 입 니까?
위 키 백과 정의:https://en.wikipedia.org/wiki/Cross-site_request_forgery
CSRF 크로스 사이트 위조 요청 (Cross - Site Request Forgery), 이해 하기 편리 하도록 참조http://blog.csdn.net/stpeace/article/details/53512283위의 예 를 들 어 설명 하 다.
예 에서 다음 과 같은 세 가지 역할 과 관련된다.
웹 A: 보안 구멍 이 있 는 사이트;
웹 B: CSRF 공격 을 하 는 악성 사이트;
User C: 웹 A 사이트 의 권한 수여 사용자.
CSRF 공격 과정:
  • User C 는 브 라 우 저 에서 Web A 를 열 고 사용자 이름과 비밀 번 호 를 입력 하여 로그 인 합 니 다.
  • 웹 A 가 User C 의 로그 인 정 보 를 검증 하고 통과 하면 웹 A 가 쿠키 정 보 를 생 성하 여 브 라 우 저 에 되 돌려 주 고 User C 로그 인 에 성공 하면 웹 A 에 요청 을 보 낼 수 있다.
  • User C 는 웹 A 를 종료 하지 않 은 채 같은 브 라 우 저 에서 웹 B 에 접근 하 는 페이지 를 열 었 다.
  • 웹 B 는 User C 가 모 르 는 상태 에서 웹 A 에 요청 (요청 헤더 에 브 라 우 저 에 있 는 User C 의 쿠키 정 보 를 저장) 을 보낸다.
  • 웹 A 는 요청 한 쿠키 정보 에 따라 해당 요청 이 User C 가 보 낸 것 으로 판단 해 웹 B 전송 요청 을 User C 권한 으로 처리한다.

  • 이렇게 하면 웹 B 는 User C 의 권한 을 통 해 웹 A 를 조작 할 수 있다.
    웹 A 가 은행 사이트 라면 웹 B 는 이러한 권한 을 통 해 User C 가 모 르 는 상태 에서 User C 계좌 의 자금 을 이체 할 수 있다.
    Django CSRF 솔 루 션
    Django 1.11 버 전의 공식 문 서 는 이에 대해 비교적 전면적 인 소 개 를 했 습 니 다. 문서 정 보 는 다음 과 같 습 니 다.
    원본 주소:https://docs.djangoproject.com/en/1.11/ref/csrf/
    번역 주소:https://www.jianshu.com/p/2b6c69f2d520
    Django 는 언제 CSRF 방 어 를 합 니까?
    Django 는 django - admin startprocject 명령 을 사용 하여 만 든 프로젝트 에 csrfview middleware 백 엔 드 를 자동 으로 설정 하여 CSRF 방 어 를 합 니 다.
    csrfview middleware 는 POST, PUT, DELETE 등 요청 을 검사 합 니 다. 이 요청 들 이 csrf token 을 포함 하지 않 거나 포 함 된 csrf token 이 정확 하지 않 으 면 403 Forbidden 응답 을 되 돌려 줍 니 다.
    403 Forbidden 을 해결 하 는 간단 한 방법
    이것 은 우리 가 Django 개발 을 시작 할 때 자주 겪 는 문제 이다.'403 Forbidden' 을 해결 하 는 가장 간단 한 방법 은 Django 의 csrf 방어 설정 을 취소 하 는 것 입 니 다. 우 리 는 다음 과 같은 두 가지 방법 으로 실현 할 수 있 습 니 다.
  • settings. py 파일 을 열 고 MIDDLEWARE 설정 에 있 는 'django. middleware. csrf. csrfView Middleware' 를 주석 하거나 삭제 합 니 다.
  • POST 요청 을 처리 하기 위 한 보기 에 csrf 추가exempt 장식 기.
  • from django.views.decorators.csrf import csrf_exempt
    from django.http import HttpResponse
    ​
    @csrf_exempt
    def my_view(request):
     return HttpResponse('Hello world')
    이 두 가지 방법 은 '403 Forbidden' 문 제 를 해결 할 수 있 으 나 csrfview middleware 백 엔 드 를 사용 하지 않 으 면 사이트 가 CSRF 공격 을 받 으 면 방어 할 수 없습니다.
    따라서 csrfview middleware 백 엔 드 검 사 를 통 해 어떻게 든 해 야 합 니 다.
    올 바른 방법
    csrfview middleware 는 POST, PUT, DELETE 등에 대해 다음 과 같은 검 사 를 요청 합 니 다.
  • 쿠키 와 POST (PUT 또는 DELETE) 데이터 에 csrf token 정보 가 포함 되 어야 합 니 다.
  • 쿠키 와 POST (PUT 또는 DELETE) 데이터 의 csrf token 이 일치 해 야 합 니 다.

  • 만약 우리 가 상기 두 가지 요 구 를 만족 시 킬 수 있다 면 csrfview middleware 의 검증 을 통과 할 수 있 습 니 다.
    다음은 Django 개발 에서 가장 많이 사용 되 는 폼 POST 요청 과 AJAX POST 요청 의 설정 방법 을 해결 합 니 다.
    양식 양식
    폼 템 플 릿 의 요소 에 csrf 만 추가 하면 됩 니 다.token 템 플 릿 탭 을 사용 하면 됩 니 다:
    
     {% csrf_token %}
    

    그리고 render () 함수 나 일반 보기 렌 더 링 폼 템 플 릿 을 사용 하면 됩 니 다.백 스테이지 에서 자동 으로 {% csrf_token %} 렌 더 링
    
    

    이러한 POST 데 이 터 는 csrfmiddlewaretoken 이라는 키 값 을 통 해 csrf token 을 포함 하 는 정 보 를 추가 합 니 다. 또한 배경 에는 쿠키 에 csrf 를 추가 합 니 다.token。
    이렇게 하면 csrfview middleware 의 검사 수 요 를 통과 할 수 있 습 니 다.
    AJAX
    AJAX 는 다음 과 같은 세 가지 방법 으로 처리 할 수 있다.
    방법 1:
    Django 가 제공 하 는 방법: 조건 을 만족 시 키 는 XML HttpRequest 에 사용자 정의 X - CSRFtoken 레이 블 을 설정 하여 CSRF token 을 저장 합 니 다.많은 JavaScript 프레임 워 크 가 모든 요청 에 레이 블 을 설정 하 는 hooks 를 제공 하기 때문에 간단 합 니 다.
     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', '{{ csrf_token }}');
     }
     }
     });
    

    csrf 추가 설정token 의 전제조건, 만족 요구!csrfSafeMethod(settings.type) && !this. cross Domain 만 추가 할 수 있 습 니 다. csrf 를 피하 기 위해 서 입 니 다.token 유출.
    여기 서 사용 하 는 것 은 {csrf token} 입 니 다. Django 는 token 의 값 으로 표시 하고 쿠키 에 csrf 를 추가 합 니 다.token。이렇게 하면 POST 데이터 와 쿠키 에 같은 값 을 포함 하 는 것 을 만족 시 킬 수 있다.
    방법
    ajax Setup 의 data 에 csrf 설정token, 이렇게 하면 ajax post (put, delete) 가 요청 한 data 에 csrf token 을 추가 합 니 다.
     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) {
     data:{csrfmiddlewaretoken:'{{ csrf_token }}'}
     }
     }
     });
    

    일반적인 상황 에서 방법 2 는 방법 1 과 같 지만 ajax post 전송 직렬 화 데이터, 예 를 들 어:
    $.post('/', $('form').serialize())
    

    jQuery 는 직렬 화 된 데 이 터 를 ajax Setup data 의 데이터 와 통합 할 수 없어 ajax 의 POST 데이터 에 csrf token 이 포함 되 어 있 지 않 습 니 다.
    방법 3:
    POST 마다 요청 한 ajax 의 data 에 csrf token 을 추가 합 니 다. 즉,:
    $.ajax({
     url:"...",
     data:{"csrfmiddlewaretoken":'{{ csrf_token }}','other_key':'value'}
     type:"POST",
     success:function (data) {
     alert(data)
     }
     })
     })
    

    이 방법 은 간단 하지만 ajax POST 요청 이 여러 개 있 으 면 귀 찮 습 니 다.
    csrf token 템 플 릿 탭 이 정상적으로 작 동 하 는 방법
    앞에서 {% csrf token%} 과 {{csrf token}} 템 플 릿 탭 을 사 용 했 습 니 다. csrf token 이 정상적으로 작 동 하도록 하려 면 csrfview middleware 백 엔 드 를 시작 하거나 csrf protect 장식 기 를 설정 해 야 합 니 다. 둘 다 실행 되 지 않 았 다 면 requests csrf token 장식 기 를 사용 해 야 합 니 다.
    위의 템 플 릿 탭 을 사용 하여 csrf token 을 가 져 오 는 것 을 강력 추천 합 니 다. 이 방법 을 사용 하지 않 으 면 AJAX 에 서 는 CSRF USE SESSION 의 값 에 따라 쿠키 나 session 에서 csrf token 을 가 져 올 수 있 습 니 다.
    쿠키 에서 csrf token 가 져 오기
    
    
     var csrftoken = $.cookie('csrftoken');
    </code></pre> 
     <p>         CDN  jQuery cookie  ,       cookie  ,        csrf token   。        csrftoken    {{ csrf_token }}。</p> 
     <p><strong>  session     csrf_token</strong></p> 
     <p>         csrf_token:</p> 
     <pre><code>{% csrf_token %}
    <script type="text/javascript">
    // using jQuery
    var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
    
    

    이런 방법의 전 제 는 HTML 에 반드시 CSRF token 이 포함 되 어야 한 다 는 것 이다.

    좋은 웹페이지 즐겨찾기