Django 진급 CSRF 의 해결

3876 단어 DjangoCSRF
간단 한 소개
django 는 사용자 에 게 크로스 오 버 요청 의 위 조 를 방지 하 는 기능 을 실현 하고 미들웨어 django.middleware.csrf.csrf View Middleware 를 통 해 이 루어 집 니 다.django 에 서 는 크로스 오 버 역 을 설치 하여 위조 요청 기능 을 전역 과 부분 으로 나 누 었 습 니 다.
전역:
미들웨어 django.middleware.csrf.csrfView Middleware
부분:
@csrf_protect,현재 함수 에 크로스 오 버 방지 기능 을 강제로 설정 합 니 다.settings 에 전역 미들웨어 가 설정 되 어 있 지 않 더 라 도.
@csrf_exempt,현재 함수 크로스 오 버 요청 위조 기능 을 취소 합 니 다.settings 에 전역 미들웨어 가 설정 되 어 있 더 라 도.
메모:from django.views.decorators.csrf import csrfexempt,csrf_protect
의 원리
post 로 데 이 터 를 제출 할 때 django 는 csrf 의 무 작위 문자열 이 있 는 지 확인 합 니 다.없 으 면 오류 가 발생 할 수 있 습 니 다.이것 도 예전 에 우리 가 주석 을 달 았 던 이유 입 니 다.오 류 는 다음 과 같 습 니 다.

django 내부 에서 이 무 작위 문자열 생 성 지원
form 으로 제출
form 폼 에{%csrf 를 추가 해 야 합 니 다.token%}
이렇게 하면 페이지 원본 코드 를 볼 때 form 에 input 가 숨겨 져 있 는 것 을 볼 수 있 습 니 다.

요약 원리:사용자 가 login 페이지 에 접근 할 때 csrf 의 무 작위 문자열 이 생 성 되 고 쿠키 에 도 이 무 작위 문자열 이 저장 되 어 있 습 니 다.사용자 가 데 이 터 를 다시 제출 할 때 이 무 작위 문자열 을 가지 고 제출 합 니 다.이 무 작위 문자열 이 없 으 면 제출 할 수 없습니다.
쿠키 에 저 장 된 csrftoken 은 다음 과 같 습 니 다.

ajax 로 제출
쿠키 에 csrftoken 이 존재 하기 때문에 js 에서 통과 할 수 있 습 니 다.
$.cooke("cstftoken")가 져 오기
ajax 를 통 해 데 이 터 를 제출 하면 여기 서 제출 한 csrftoken 은 요청 헤더 에 저 장 됩 니 다.사전 형식의 데 이 터 를 제출 해 야 합 니 다.즉,이 럴 때 key 가 필요 합 니 다.
views 의 login 함수 에서:from django.conf import settings,그리고 print(settings.CSRFHEADER_NAME)
이 곳 에서 가 져 온 settings 는 프로젝트 파일 에서 보 이 는 settings.py 파일 이 아 닙 니 다.전역 settings 설정 입 니 다.프로젝트 디 렉 터 리 에 있 는 settings.py 에서 설정 할 때 추 가 된 설정 은 전역 settings 의 설정 을 덮어 씁 니 다.
print(settings.CSRF_HEADER_NAME)인쇄 된 내용 은:HTTPX_CSRFTOKEN
여기 HTTPX_CSRFTOKEN 은 django 입 니 다.XCSRF 앞 에 HTTP 를 추 가 했 습 니 다.그래서 실제 전달 하 는 것 은 X 입 니 다.CSRFtoken,프론트 페이지 의 ajax 가 전 달 될 때 밑줄 을 사용 할 수 없 기 때문에 X 를 전 달 했 습 니 다.CSRFtoken
다음은 전단 ajax 에 적 힌 구체 적 인 내용 입 니 다.

$("#btn1").click(function () {
    $.ajax({
      url:"/login/",
      type:"POST",
      data:{"usr":"root","pwd":"123"},
      headers:{ "X-CSRFtoken":$.cookie("csrftoken")},
      success:function (arg) {

      }
    })
  })
단,페이지 에 여러 개의 ajax 요청 이 있 으 면 각각 ajax 에 headers 정 보 를 추가 하기 때문에 아래 방식 으로 모든 ajax 에 추가 할 수 있 습 니 다.

  $.ajaxSetup({
      beforeSend:function (xhr,settings) {
        xhr.setRequestHeader("X-CSRFtoken",$.cookie("csrftoken"))
      }
    });
이렇게 하면 ajax 를 제출 하기 전에 이 방법 을 실행 하여 모든 ajax 에 이 csrftoken 을 추가 합 니 다.
여기 xhr 는 XML HttpRequest 의 약자 입 니 다.ajax 가 호출 한 것 이 바로 이 방법 입 니 다.
get 방식 을 실현 하려 면 csrftoken 을 제출 하지 않 아 도 됩 니 다.post 를 할 때 이 효 과 를 실현 하 는 코드 는 다음 과 같 습 니 다.

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);
        }
      }
    });
이렇게 해서 GET|HEAD|OPTIONS|TRACE 라 는 방식 으로 요청 할 때 csrftoken 을 제출 하지 않 아 도 됩 니 다.
총결산
1.csrf 가 ajax 에서 제출 할 때 요청 헤드 를 통 해 백 엔 드 에 전달 하 는
2.csrf 가 프론트 에 있 는 key 는 X-CSRFtoken 이 고 백 엔 드 에 있 을 때 django 는 자동 으로 HTTP 를 추가 합 니 다.그리고 마지막 으로 HTTPX_CSRFtoken
3.csrf 가 form 에 제출 할 때 전단 form 에{%csrftoken%}을 추가 해 야 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기