2014-07-16 6 views
3

Django 1.6.4 응용 프로그램에 POST 요청을하는 AJAX 코드가 있습니다. 이보기에는 django.middleware.csrf.CsrfViewMiddleware을 통해 CSRF 보호가 활성화되어 있습니다. 쿠키를 전달하지 않고 HTTP_X_CSRFTOKEN을 전달하면 실패합니다.Django 1.6 csrf 쿠키가없는 경우 HTTP_X_CSRFTOKEN 헤더가 무시됩니다.

나는 django.middleware.csrf.CsrfViewMiddleware 코드를보고 있는데, 161 행에서 쿠키에서 가져온 후 if csrf_token is None:인지 확인합니다. None이면 반환합니다. 이후에만 csrfmiddlewaretoken 매개 변수와 HTTP_X_CSRFTOKEN 요청 헤더를 확인합니다. 이것은 틀린 것으로 보이며 누락 된 csrf_token 값에 대한 점검은 발견 될 수있는 모든 가능한 위치를 확인한 후에 만 ​​이루어져야합니다.

그 외 다른 유사한 문제가 있습니까? 내가 잘못 본 건가요?

답변

0

jQuery를 사용하는 경우 csrf 토큰을 포함하는 beforeSend 함수를 만들 수 있습니다. 자세한 내용은 Django CSRF을 참조하십시오.

Django는 X-CSRFToken이 아닌 HTTP_X_CSRFTOKEN 헤더를 찾습니다. 적어도 코드를 디버깅하는 동안 내 문제가있었습니다.


if csrf_token is None 장고에 의해 수행 여분의 검사는 (나는 또한 이것에 대한 django.middleware.csrf.CsrfViewMiddleware을 확인). (은 if 문에서 주석에서 언급했다.

없음 CSRF 쿠키. POST 요청의 경우, 우리는 CSRF 쿠키, 주장이 방법으로 우리가 로그인 CSRF를 포함한 모든 CSRF 공격을 피할 수 있습니다.

난 단지 아약스 POST 요청에서 헤더를 확인하려면 단일 검사가없는 (확인되지 ​​않음) 생각 와 장고 CSRF 공격의 형태를 방지하기 위해 검사를 할 것입니다.

+0

저는 'beforeSend'에 대해 알고 있고 그것을 사용하고 있습니다. HTTP 헤더는 X-CSRFToken이라고 불리우는 반면 Django는 HTTP_X_CSRFTOKEN을 HTTP_를 앞에 붙여서 사용할 수 있습니다. https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META를 참조하십시오. 그러나 이것은 내 문제가 아닙니다. 나는 헤더 값을 제공하고 Django는 그것을 보지 않는다. (원래 게시물에서 언급 한 Django 소스를 보자.) –

+0

내 대답을 업데이트했다. – Eagllus

2

나는 혼란이 있다고 생각 CSRF 쿠키와 HTTP_X_CSRFTOKEN 비교의 반대쪽에 HTTP 헤더가 있습니다. CSRF 공격을 방지하기 위해 즉, 장고는 비교 : POST 토큰 값 ("csrfmiddlewaretoken") 대

CSRF 쿠키 값

(또는)

HTTP 헤더 값 대

CSRF 쿠키 값 (" HTTP_X_CSRFTOKEN ")

쿠키가 인 이유는 항상입니다. HTTP_X_CSRFTOKEN 머리글을 사용하면 POST 데이터의 토큰을 설정하는 대신 쿠키 대신 사용할 수 있습니다.