Django 진급 CSRF 의 해결
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%}을 추가 해 야 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.