2012-07-06 2 views
0

AJAX를 사용하여 사용자 양식을 제출하고 AJAX를 통한 데이터 제출이 필요한 다른 사용자 상호 작용을 처리하는 내 사이트에서 Codeigniter의 CSRF 보호를 활성화했습니다. 결과적으로 "허용되지 않는 작업"에 대한 서버 측 오류가 발생했습니다. 나는 자바 스크립트가 수집하고 AJAX를 통해 제출 한 데이터 만이 서버로 전달되었고 결과적으로 CSRF 코드가 전송되지 않았다는 사실을 빨리 깨달았다. 그래서이 추가 후 값을 얻기 위해 csrf_test_name에 jQuery를 선택기를 사용하고 나에게 확인을 위해 서버에 토큰을 제출하는 가장 간단한 방법을 보인다Codeigniter CSRF 문자열을 AJAX를 통해 서버에 전달

<input type="hidden" name="csrf_test_name" value="dsflkabsdf888ads888XXXXXX" /> 

: 같은

생성 된 토큰 태그 보인다 서버가 확인할 수있는 내 게시물 데이터 아래의 코드에 따라 :

//get CSRF token 
var csrf = $('[name="csrf_test_name"]').val(); 

//build the form data array 
var form_data = { 
    csrf_test_name: csrf, 
    ... ... ... 
    ... ... ... 
} 

//send the form data to the server so it can be stored 
$.ajax({ 
    type: "POST", 
    data: form_data, 
    url: ..., 
    dataType: "html", 
    success: function(msg){ 
     ... ... ... 
    }//end success 
});//end ajax 

I는 서버와 고정되어 서버 측 오류로 데이터를 전송하고 모든 것이 잘 작동 모든 아약스 제출이 절차를 따랐다.

이 테스트하려면 올바르지 않은 CSRF 토큰으로 하드 코딩되어 있으며 서버가 불일치를 감지하고 표면에 오류 코드 500을 반환합니다.

제 질문은 이것이 안전한 방법일까요? 따라야 할 모범 사례가 있습니까? 나는 이것에 대해 검색하는 몇몇 구글을 해왔고, 다른 모든 방법들이 더 복잡해 보이고, 내 방식으로 볼 수없는 공격 벡터가 생기면/운동하는지 궁금하다.

+0

나는 당신과 똑같은 방법을 사용하며 일반적으로 권장되는 방법입니다. AFIK는 안전하지만 더 이상 생각하지 않을 것입니다! – Motive

+0

백엔드 코드에 논리적 인 흠집이 없다면 괜찮은 것처럼 보일 것입니다. 이는 아마도 거의 일어나지 않을 것입니다. 나는 당신이 그들이 일치하지 않을 때 500 에러를 반환하지 않도록 할 것이지만, 그것은 선호의 문제라고 생각합니다. 또한 가장 작은 XSS라도 10 개 중 9 개가 csrf 보호를 무효화합니다. –

+0

의견을 보내 주셔서 감사합니다. 나는 Codeigniter를 사용하고 있으며 모든 글로벌 XSS 필터를 가지고 있으므로 Codeigniter 문서에 대한 대부분의 공격을 저지해야한다. – SimonBarker

답변

1

더 쉬운 방법은 $.ajaxSetup()에 해당 csrf를 전달하는 것입니다. 그러면 나중에 $.ajax() 요청에 포함됩니다.

var csrf = $('input[name="csrf_test_name"]').val(); 
var data = {}; 
data[CSRF] = csrf; 

$.ajaxSetup({ 'data': data }); 

설치 후 요청에 data: { csrf_test_name: 'xxx', ... }을 포함 할 필요가 없습니다.

2

저는 Ajax 설정에 추가하고 싶습니다. 한 번 설정하고 모든 요청에 ​​대한 게시물 데이터에 자동으로 추가하도록합니다.

$.ajaxSetup({ 
    data: { 
     csrf_test_name: $("input[name='csrf_test_name']").val() 
    } 
}); 
관련 문제