2016-11-28 6 views
0

Chrome 시크릿에서 작동하는 사파리 개인 정보 보호 브라우징의 내 django 웹 애플리케이션에 데이터를 POST 할 수 없습니다.Safari 개인 정보 보호 브라우징을 사용하는 장고에서 CSRF가 작동하지 않습니다.

localstorage를 사용하고 있지 않습니다.

난 {%의 csrf_token의 %}을 사용하여 숨겨진 입력 I 찰스를 사용하여 상기 요청을 검사 한 <form>

안에 존재

var csrftoken = NMA.getCookie('csrftoken'); 
$.ajax({ 
    type:"POST", 
    contentType: 'application/json; charset=utf-8', 
    beforeSend: function (request, settings) { 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain){ 
      request.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    }, 
    url: "/profiler/logAnswers/ 
    data: payload, 
    dataType: 'json' 
}).done(... 

csrftoken 쿠키가 설정을 이용하여 X-CSRFToken 헤더를 설정 csrftoken 쿠키가 설정되고 X-CSRFToken 헤더가 설정됩니다.

개인 정보 보호 브라우징의 사파리가 헤더에 "DNT = 1"(추적하지 않음)을 추가했음을 알았습니다. 문제가 원인인지 확실하지 않습니다. Chrome 시크릿 요청에는 DNT = 1이 없습니다.

나는

logger.debug(request.COOKIES) 

를 사용

python2.7/사이트 패키지/장고/미들웨어/csrf.py

에 쿠키를 로그온하고 csrftoken 쿠키입니다 누락되었습니다 (그리고 여러 다른 쿠키가 누락되었습니다). 인쇄 된 쿠키는 4 개뿐입니다. 퀘스트에 표시되는 초기 요청에는 13 개의 쿠키가 있습니다.

더 csrftoken 이것은

금단 (CSRF 쿠키가 설정되지 않음.)가 발생하지있는 한 403 오류.

헤더의 DNT = 1은 무엇을합니까? 허용되는 쿠키 수를 제한합니까? 특정 유형의 쿠키를 차단합니까?

+0

살펴 http://osxdaily.com/2012/08/21/how-to-enable-do-not-track-in을 모든 쿠키에 인용 부호를 대체하는 것입니다 -safari-6/ – itzMEonTV

+0

사용하거나 사용하지 않으려합니다. 사용자가 사파리에서 개인 모드를 사용하는 경우 Webapp을 작동시키고 싶습니다. DNT 헤더는 django가 요청을 처리하는 방법을 변경하는 것으로 보입니다. –

답변

0

문제점 (localstorage를 사용할 수 없게하기 위해) json 개체가 쿠키에 저장되어 있습니다. 문자열의 모든 인용 부호가있는 경우에만 쿠키의 몇 가지 원인이

https://bugs.python.org/issue27674

디코딩 할 : 파이썬 버그 나 문제가 있습니다.

그래서 솔루션은