2012-11-15 3 views
0

json 데이터를 사용하여 양식을 서버에 게시하고 서버가 데이터베이스에 저장합니다. 여기에 모두 200 HTTP 확인 반환, 나는 두 번 (버튼을 통해) saveChanges를 호출, 문제는 내 코드ajax의 django csrf가 작동하지 않습니다.

function saveChanges() { 
    var items = []; 
    $('ol.item_list > li.item').each(function(){ 
     items.push(getItemData($(this))); 
    }); 

    var csrftoken = $.cookie('csrftoken'); 
    $.ajax({ 
     url : '', 
     type: 'POST', 
     headers : {"X-CSRFToken": csrftoken}, 
     data : $.toJSON(items), 
     success: function(data, textStatus, jqXHR){ 
      console.log(data); 
     }, 
     error: function(jqXHR, textStatus, errorThrown){ 
      alert(textStatus); 
     }, 
    }); 

} 

입니다. 그래서 데이터베이스에 중복 된 데이터가 있습니다. csrf 토큰이 중복되는 것을 방지해야합니까? 어떻게 해결할 수 있습니까?

답변

0

아니요, CSRF 토큰은 어떤 종류의 중복 제출도 막지 않습니다. 그 목적은 Cross Site Request Forgery을 예방하는 것입니다. 그것은 의도하지 않는 요청을 제출할 때 아무도 당신을 속일 수 없도록 토큰을 생성합니다.

중복 제출을 방지하려면 한 번 클릭 한 후 제출 버튼을 비활성화하는 것이 좋습니다. 그러나 JavaScript는 클라이언트 측에서 실행되며 쉽게 조작 할 수 있기 때문에 (예 : 방화범을 통해) 좋은 해결책은 아닙니다. 따라서 중복 제출은 여전히 ​​가능할 것입니다.

더 좋은 방법은 서버 측 파이썬 코드에서 유효성 검사를하는 것입니다. 제출 된 데이터가 이미 데이터베이스에 있는지 확인할 수 있습니다. 요청한 경우 데이터를 무시하거나 선택적으로 오류 메시지를 반환 할 수 있습니다. 이렇게하면 자바 스크립트를 둘러 보면서 악의적 인 사용자가 데이터를 두 번 저장할 수 없게됩니다.

나는이 두 가지 방법을 모두 사용 하겠지만 첫 번째 방법은 사용자에게 동일한 데이터를 두 번 제출해서는 안된다는 것을 알려주는 것입니다. 이는 단지 인터페이스 퍼크입니다.

1

스크립트 실행 흐름 & 스크립트 구조를 적절하게 조정하여 이중 제출을 방지해야합니다.

관련 문제