csrf 크로스 도 메 인 방 어 를 이해 하지 못 하 는 문제

1.웹 크로스 필드 요청 문제 원리
1.왜 크로스 제한 이 있어 야 합 니까?
예 를 들 어:
1.사용자 가 자신의 은행 페이지 에 로그 인http://mybank.com,http://mybank.com사용자 의 쿠키 에 사용자 표 지 를 추가 합 니 다.2.사용자 가 악성 페이지 를 탐색http://evil.com。페이지 에 있 는 악성 AJAX 요청 코드 를 실 행 했 습 니 다.3.http://evil.com향 하 다http://mybank.comAJAX HTTP 요청 을 하면 기본 값 으로 요청 합 니 다.http://mybank.com대응 쿠키 도 동시에 보 냅 니 다.4.은행 페이지 는 보 낸 쿠키 에서 사용자 표 지 를 추출 하고 사용자 가 틀림 이 없 음 을 검증 하 며 response 에서 요청 데 이 터 를 되 돌려 줍 니 다.이때 데이터 가 유출 되 었 다.5.또한 Ajax 가 배경 에서 실행 되 기 때문에 사용 자 는 이 과정 을 감지 할 수 없습니다.이상 은 CSRF(Cross-site request forgery)공격 이 며,크로스 오 버 는 위 조 를 요청 한 것 이다.다음은 Django 에서 csrf 를 처리 하 는 방법 을 말씀 드 리 겠 습 니 다.
2.해결 방향
정상 적 인 상황 에서 직접 post 요청 을 하면 오류 가 발생 할 수 있 습 니 다.csrf 검사 에 실 패 했 습 니 다.request 요청 이 버 려 졌 습 니 다.
그러면 django 에서 의 post 실 패 는 두 가지 해결 방법 이 있 습 니 다.
해결 방법 1:csrf 중간 층 주석 제거
MIDDLEWARE = [
 
  'django.middleware.security.SecurityMiddleware',
 
  'django.contrib.sessions.middleware.SessionMiddleware',
 
  'django.middleware.common.CommonMiddleware',
 
#  'django.middleware.csrf.CsrfViewMiddleware',
 
  'django.contrib.auth.middleware.AuthenticationMiddleware',
 
  'django.contrib.messages.middleware.MessageMiddleware',
 
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
 
]

이 때 csrf 검 사 를 하지 않 지만 앞에서 말 한 것 처럼 안전 하지 않 은 행동 입 니 다.그리고 djano 도 추천 하지 않 아 요.
해결 방법 2:
앞의 힌트 중 에 이런 말 이 있다.
<form action="" method="post">{% csrf_token %}

즉,웹 페이지 에 csrf 를 추가 합 니 다.token 탭 은 csrf 를 통 해 검사 할 수 있 습 니 다.
Django 가 제공 하 는 CSRF 보호 메커니즘:
1.django 가 한 클 라 이언 트 의 요청 에 처음 응답 할 때 서버 에서 무 작위 로 token 을 생 성하 여 이 token 을 쿠키 에 넣 습 니 다.그리고 POST 요청 때마다 이 token 을 가 져 가면 CSRF 공격 을 피 할 수 있 습 니 다.
2.돌아 오 는 HTTP 응답 쿠키 에 django 는 csrftoken 필드 를 추가 합 니 다.그 값 은 자동 으로 생 성 되 는 token 입 니 다.모든 POST 폼 에 csrfmiddlewaretoken 필드(템 플 릿 에 tag 만 추가 하면 django 가 자동 으로 생 성 됩 니 다.아래 참조)3.POST 요청 을 처리 하기 전에,django 는 이 요청 한 쿠키 의 csrftoken 필드 의 값 과 제출 한 폼 의 csrfmiddlewaretoken 필드 의 값 이 같 는 지 검증 합 니 다.만약 같다 면,이것 은 합 법 적 인 요청 임 을 나타 낸다.그렇지 않 으 면,이 요청 은 다른 사람의 csrf 공격 에서 온 것 일 수도 있 고,403 Forbidden 으로 돌아 갈 수도 있다.
4.모든 ajax POST 요청 에 X-CSRFTOKEN header 를 추가 합 니 다.그 값 은 쿠키 의 csrftoken 값 입 니 다.
3.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 의 무 작위 문자열 이 있 는 지 확인 합 니 다.없 으 면 오 류 를 보고 할 수 있 습 니 다.이것 도 예전 에 우리 가 주석 을 달 았 던 이유 입 니 다.오 류 는 다음 과 같 습 니 다关于不理解csrf跨域防范的问题_第1张图片django 내부 에서 이 무 작위 문자열 생 성 을 지원 합 니 다.
form 으로 제출
form 폼 에{%csrf 를 추가 해 야 합 니 다.token%}
이렇게 하면 페이지 원본 코드 를 볼 때 form 에 input 가 숨겨 져 있 는 것 을 볼 수 있 습 니 다.
4.567915.정리 원리:사용자 가 login 페이지 를 방문 할 때 csrf 의 무 작위 문자열 을 생 성 합 니 다.또한 쿠키 에 도 이 무 작위 문자열 이 저장 되 어 있 습 니 다.사용자 가 데 이 터 를 다시 제출 할 때 이 무 작위 문자열 을 가지 고 제출 합 니 다.이 무 작위 문자열 이 없 으 면 제출 할 수 없습니다.
쿠키 에 저 장 된 csrftoken 은 다음 그림 과 같 습 니 다关于不理解csrf跨域防范的问题_第2张图片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%}을 추가 해 야 합 니 다.

좋은 웹페이지 즐겨찾기