[ruby-on-rails] 경고 : CSRF 토큰 진위 여부를 확인할 수 없습니다

AJAX를 사용하여보기에서 컨트롤러로 데이터를 보내고 있는데이 오류가 발생했습니다.

경고 : CSRF 토큰 진위를 확인할 수 없습니다

나는이 토큰을 데이터와 함께 보내야한다고 생각합니다.

아무도 내가 어떻게 할 수 있는지 알고 있습니까?

편집 : 내 솔루션

AJAX 포스트에 다음 코드를 넣어서이 작업을 수행했습니다.

headers: {
  'X-Transaction': 'POST Example',
  'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
},



답변

이 작업을 수행해야합니다.

  1. <%= csrf_meta_tag %>레이아웃에 있는지 확인하십시오

  2. 추가 beforeSend모든 아래와 같이 헤더를 설정하는 아약스 요청을 :


$.ajax({ url: 'YOUR URL HERE',
  type: 'POST',
  beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
  data: 'someData=' + someData,
  success: function(response) {
    $('#someDiv').html(response);
  }
});

모든 요청에서 토큰을 보내려면 다음을 사용할 수 있습니다.

$.ajaxSetup({
  headers: {
    'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
  }
});


답변

이를 수행하는 가장 좋은 방법은 실제로 <%= form_authenticity_token.to_s %>레일 코드에서 직접 토큰을 인쇄하는 데 사용 하는 것입니다. 다른 게시물에서 언급했듯이 자바 스크립트를 사용하여 csrf 토큰의 돔을 검색 할 필요는 없습니다. 아래와 같이 헤더 옵션을 추가하십시오.

$.ajax({
  type: 'post',
  data: $(this).sortable('serialize'),
  headers: {
    'X-CSRF-Token': '<%= form_authenticity_token.to_s %>'
  },
  complete: function(request){},
  url: "<%= sort_widget_images_path(@widget) %>"
})


답변

올바르게 기억한다면이 문제를 해결하기 위해 양식에 다음 코드를 추가해야합니다.

<%= token_tag(nil) %>

매개 변수를 잊지 마십시오.


답변

실제로 가장 간단한 방법입니다. 헤더 변경에 신경 쓰지 마십시오.

당신이 가지고 있는지 확인하십시오 :

<%= csrf_meta_tag %> in your layouts/application.html.erb

다음과 같이 숨겨진 입력 필드를 수행하십시오.

<input name="authenticity_token"
               type="hidden"
               value="<%= form_authenticity_token %>"/>

또는 jQuery 아약스 게시물을 원한다면 :

$.ajax({
    type: 'POST',
    url: "<%= someregistration_path %>",
    data: { "firstname": "text_data_1", "last_name": "text_data2", "authenticity_token": "<%= form_authenticity_token %>" },
    error: function( xhr ){
      alert("ERROR ON SUBMIT");
    },
    success: function( data ){
      //data response can contain what we want here...
      console.log("SUCCESS, data="+data);
    }
});


답변

csrf 메타 태그를 포함하여 이전 앱에서 rails 3.1로 업그레이드해도 여전히 해결되지 않습니다. rubyonrails.org 블로그에서 업그레이드 팁, 특히 레이아웃의 헤드 섹션에있는 jquery 라인을 제공합니다.

$(document).ajaxSend(function(e, xhr, options) {
 var token = $("meta[name='csrf-token']").attr("content");
  xhr.setRequestHeader("X-CSRF-Token", token);
});

이 블로그 게시물에서 가져 왔습니다 : http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails .

필자의 경우 세션은 각 아약스 요청에 따라 재설정되었습니다. 위의 코드를 추가하면 문제가 해결되었습니다.


답변

  1. <%= csrf_meta_tag %>레이아웃에 있는지 확인하십시오
  2. beforeSend헤더를 설정하기 위해 ajax 요청에 csrf-token을 포함 시키려면 a 를 추가하십시오 . 이것은 post요청 에만 필요 합니다.

csrf-token을 읽는 코드는에서 사용할 수 rails/jquery-ujs있으므로 다음과 같이 사용하는 것이 가장 쉽습니다.

$.ajax({
  url: url,
  method: 'post',
  beforeSend: $.rails.CSRFProtection,
  data: {
    // ...
  }
})


답변

기사에 당신이 찾고있는 대부분의 답변이 있으며 매우 흥미 롭기 때문에 여기에 링크한다고 생각했습니다.

http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/