장고 수필: 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 공격 과정:
이렇게 하면 웹 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 방어 설정 을 취소 하 는 것 입 니 다. 우 리 는 다음 과 같은 두 가지 방법 으로 실현 할 수 있 습 니 다.
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 등에 대해 다음 과 같은 검 사 를 요청 합 니 다.
만약 우리 가 상기 두 가지 요 구 를 만족 시 킬 수 있다 면 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 이 포함 되 어야 한 다 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.