2017-02-09 3 views
1

나는 장고에서 CSRF와 이상한 문제가 있습니다. 내 자바 스크립트 파일에서Django ajax 403 때문에 httponly 쿠키

내가 가진 : 다음은 관련 부분이다

다음
function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie !== '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) === (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 
var csrftoken = getCookie('csrftoken'); 

function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 

$(function() { 
    $.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
    }); 
}) 

$.post('/api/jpush', 
    $.param({'recipients': recipients, 'message': message, 'url': url, 
      'url_title': url_title, 'priority': priority, 
      'csrftoken': getCookie('csrftoken')}), 
... 

내가보기에이 :

def push(request):  
    return render(request, 'api/push.html')  

def jpush(request): 
    tmplData = {'result': False} 

    if not request.POST: 
    return HttpResponseBadRequest(request) 
    elif request.POST.viewkeys() & {'recipients', 'message', 'priority'}: 
    tmplData = { 'results': send(request.POST) } 

    return JsonResponse(tmplData) 

.... 

내 템플릿 :

<form id="push" class="form-horizontal" action="" method="post">{% csrf_token %} 

그러나 내가 아약스를 사용하여 게시 할 때 403이 나오고 방화범이 표시되면 crsftoken 값이 null이고 csrftoken 쿠키가 http라는 것을 보여줍니다 만. CSRF_COOKIE_HTTPONLY을 내 settings.py에서 False로 설정 했으므로 쿠키가 httpOnly로 강제되는 이유를 알지 못합니다. 나는 장고 1.10을 사용하고있다.

감사

+0

'CSRF_COOKIE_HTTPONLY = False'를 설정하기 전의 유일한 http 전용 쿠키. 쿠키를 지우고 다시 시도하십시오. – Alasdair

+0

예, 설정 파일을'settings.py' 파일에 넣었습니다. 쿠키를 여러 번 지웠지 만 방화 광에 의하면 항상 httponly로 돌아옵니다. 나는'document.cookie'로 쿠키를 보았습니다 만, 어떤 방화범이 끌리는지 확인하는 중 어느 쪽에도 보이지 않습니다. – echodrome

+0

서버를 재설정 한 다음 설정을 변경 한 후 쿠키를 삭제했는지 확인하십시오. – Alasdair

답변

0

그래서 나는 kambiz 여기에 언급 된 내용을 기반으로하는 솔루션을 발견 : 왜 장고에 응답하지 않습니다 여전히

$.post('/api/jpush', 
    $.param({'recipients': recipients, 'message': message, 'url': url, 
      'url_title': url_title, 'priority': priority, 
      'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val()}), 
... 

이 :

Django CSRF check failing with an Ajax POST request 나는에 아약스 매개 변수 부분을 수정 csfr 쿠키를 httponly로 강제 실행하지만 적어도 코드 작업을 계속할 수 있습니다.