2017-10-20 14 views
0

내 설정 데이터를 전송 : S3 (welcome.mydomain.com) AWS 통해 제공 방문 페이지로장고 - CSRF 검증 실패 - 내 장고 응용 프로그램에 정적 웹 사이트에 양식에서

  • 정적 웹 사이트를.
  • django app (django-1.8 with python 2.7) 하위 도메인 (app.mydomain.com)을 통해 액세스 할 수 있습니다.

내 정적 웹 사이트의 일부인 연락처 양식을 추가하고 처리 할 연락처 양식 정보를 내 장고 서버로 보냅니다. 서로 다른 스타일 시트와 리소스를 사용하고 있기 때문에 서버간에 혼합하고 싶지 않기 때문에 연락처 양식을 장고 앱에 템플릿으로 추가하고 싶지 않습니다. 양식 데이터를 처리하는보기는이 데이터를 전자 메일에 추가하고이를 내부 전자 메일 주소로 보내는 것입니다.

양식에 csrf 토큰이 없으므로 403 csrf 확인에 실패했습니다. 오류가 발생합니다.

이제는 csrf 확인에서 요청을받는보기를 면제 할 수 있지만이 보안 위험이 어떤 것인지 확신 할 수 없습니다.

나는 csrf 공격과 위험을 이해하지 못하거나이 문제를 잘못된 방향으로보고 있는지 확실하지 않습니다. 내 모든 검색 및 django csrf 관련 질문에 대한 모든 대답은 지금까지 도움이되지 않았습니다.

여기 내 질문은 :

  • 이 문제를 해결하기 위해 더 나은 방법이 있나요?
  • 보안 위험을 추가하지 않고 (예 : 추가 검증을 수행하여) csrf_exempt를 사용할 수 있습니까?

답변

0

아약스 요청에 사용되는 기술인 CSRF 토큰을 동적으로 추가 할 수 있습니다. https://docs.djangoproject.com/en/1.11/ref/csrf/에서 :

/** 
* getCookie gets a cookie called 'name' in the current session 
* @param name name of the cookie to get 
* @returns value of the cookie requested, null if not found 
*/ 
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)); 
} 

/** 
* When doing posts, deletes, etc. we need to transmit the CSRF cookie for 
* the request to go through properly, so add the cookie to all ajax calls 
* that need the cookie. 
*/ 
$.ajaxSetup({ 
    beforeSend: function (xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 

그런 다음 만들 수있는 '제출'다음 페이지로 리디렉션 뒤에 아약스 호출을 통해 폼 데이터를 게시 양식을 클릭합니다.

1

django가 제공 한 csrf_exempt decorator를 사용하여 양식의 csrf 유효성 검사를 면제하기 전에이 문제를 해결할 것을 제안합니다.

What is a CSRF token ? What is its importance and how does it work?

요즘 비록 그 것이 좋습니다 더 나은 보안 조치에 대한 형태로 csrf_token 사용자에게.