programing

경고: CSRF 토큰 인증 레일을 확인할 수 없습니다.

abcjava 2023. 9. 8. 21:04
반응형

경고: CSRF 토큰 인증 레일을 확인할 수 없습니다.

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

경고: CSRF 토큰 정품 여부를 확인할 수 없습니다.

이 토큰을 데이터와 함께 보내야 할 것 같습니다.

이거 어떻게 하는지 아는 사람?

편집: 내 솔루션

저는 AJAX post에 다음 코드를 넣음으로써 이 작업을 수행했습니다.

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

이렇게 해야 합니다.

  1. 당신이 가지고 있는지 확인해 보세요.<%= csrf_meta_tag %>당신의

  2. 더하다beforeSend아래와 같이 헤더를 설정해 달라는 모든 ajax 요청에 다음과 같이 응답합니다.


$.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 %>토큰을 직접 레일 코드에 인쇄할 수 있습니다.. javascript를 사용하면 crf 토큰을 찾을.아래와 ;아래와 같이 헤더 옵션을 추가하기만 하면 됩니다.

$.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 게시물을 원하는 경우:

$.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);
    }
});

crf 메타 태그를 포함하여 오래된 앱에서 레일 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 에서 가져온 것입니다.

저 같은 경우는 각각의 ajax 요청에 따라 세션이 재설정되고 있었습니다.위 코드를 추가하면 그 문제가 해결되었습니다.

  1. 당신이 가지고 있는지 확인해 보세요.<%= csrf_meta_tag %>당신의
  2. 를 합니다.beforeSend헤더를 설정하기 위한 ajax 요청에 crf-signal을 포함합니다.r에 필요합니다.post요청한다.

는 crf-token에서 할 수 .rails/jquery-ujs, 그래서 저는 다음과 같이 그것을 그냥 사용하는 것이 가장 쉽습니다.

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

여기서 투표된 상위 답변은 맞지만 jQuery에게 명시적으로 세션 쿠키를 전달하라고 말하지 않으면 세션을 사용할 수 없기 때문에 도메인 간 요청을 수행하는 경우에는 작동하지 않습니다.다음은 이를 수행하는 방법입니다.

$.ajax({ 
  url: url,
  type: 'POST',
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
  },
  xhrFields: {
    withCredentials: true
  }
});

당신이 찾고 있는 대부분의 답을 기사에 담고 있고 또한 매우 흥미롭기 때문에 이것을 여기에 연결하려고 생각했습니다.

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

아래와 같이 글로벌하게 작성하시면 됩니다.

일반 JS:

$(function(){

    $('#loader').hide()
    $(document).ajaxStart(function() {
        $('#loader').show();
    })
    $(document).ajaxError(function() {
        alert("Something went wrong...")
        $('#loader').hide();
    })
    $(document).ajaxStop(function() {
        $('#loader').hide();
    });
    $.ajaxSetup({
        beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}
    });
});

커피 대본:

  $('#loader').hide()
  $(document).ajaxStart ->
    $('#loader').show()

  $(document).ajaxError ->
    alert("Something went wrong...")
    $('#loader').hide()

  $(document).ajaxStop ->
    $('#loader').hide()

  $.ajaxSetup {
    beforeSend: (xhr) ->
      xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
  }

만약 당신이 jQuery를 사용하지 않고 요청을 위해 fetch API와 같은 것을 사용한다면 당신은 다음을 사용하여 얻을 수 있습니다.csrf-token:

document.querySelector('meta[name="csrf-token"]').getAttribute('content')

fetch('/users', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content')},
    credentials: 'same-origin',
    body: JSON.stringify( { id: 1, name: 'some user' } )
    })
    .then(function(data) {
      console.log('request succeeded with JSON response', data)
    }).catch(function(error) {
      console.log('request failed', error)
    })

이런..

지원서에서 다음 줄을 놓쳤습니다.js

//= require jquery_ujs

교체했는데 작동이 되네요.

======= 업데이트됨 =========

5년 만에 동일한 오류로 돌아왔고, 지금은 새로운 Rails 5.1.6을 가지고 있고, 이 게시물을 다시 찾았습니다.인생의 원처럼.

문제는 다음과 같습니다. Rails 5.1은 jqueryjquery_ujs대한 지원을 기본적으로 제거하고 추가했습니다.

//= require rails-ujs in application.js

다음과 같은 작업을 수행합니다.

  1. 다양한 조치에 대한 강제 확인 대화상자.
  2. 하이퍼링크에서 GET 이외의 요청을 합니다.
  3. 양식 또는 하이퍼링크가 Ajax와 비동기식으로 데이터를 제출하도록 합니다.
  4. submit 버튼은 더블 클릭을 방지하기 위해 submit 양식에서 자동으로 비활성화됩니다. (from: https://github.com/rails/rails-ujs/tree/master)

그런데 왜 ajax 요청에 대한 crf 토큰이 포함되어 있지 않습니까?이것에 대해 자세히 아는 사람이 있으면 저에게 댓글을 달아주세요.감사합니다.

어쨌든 저는 사용자 지정 js 파일에 다음을 추가하여 작동시켰습니다. (이 코드에 도달하는 데 도움이 되는 다른 답변 감사합니다.)

$( document ).ready(function() {
  $.ajaxSetup({
    headers: {
      'X-CSRF-Token': Rails.csrfToken()
    }
  });
  ----
  ----
});

jquery.jpf(https://github.com/swordray/jquery.csrf) 를 사용합니다.

  • 레일 5.1 이상

    $ yarn add jquery.csrf
    
    //= require jquery.csrf
    
  • 레일 5.0 이전

    source 'https://rails-assets.org' do
      gem 'rails-assets-jquery.csrf'
    end
    
    //= require jquery.csrf
    
  • 소스코드

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

jQuery와 함께 javascript를 사용하여 양식의 토큰을 생성하는 경우 다음과 같이 작동합니다.

<input name="authenticity_token" 
       type="hidden" 
       value="<%= $('meta[name=csrf-token]').attr('content') %>" />

, 은 이 합니다 합니다 이 이 있어야 합니다.<%= csrf_meta_tag %>당신의 루비 레이아웃에.

저는 이 문제로 며칠 동안 고생했습니다.모든 GET 호출이 올바르게 작동하지만 모든 PUT는 "CSRF 토큰 인증을 확인할 수 없습니다" 오류를 발생시킵니다.제 웹사이트는 제가 tginx에 SSL 인증서를 추가하기 전까지는 잘 작동하고 있었습니다.

nginx 설정에서 이 누락된 줄을 우연히 발견했습니다.

location @puma { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto https;   # Needed to avoid 'WARNING: Can't verify CSRF token authenticity'
    proxy_pass http://puma; 
}

누락된 행 "proxy_set_header X-Forwarded-Proto https;"를 추가한 후 모든 CSRF 토큰 오류가 종료됩니다.

이것이 벽에 머리를 부딪치고 있는 다른 사람에게도 도움이 되기를 바랍니다. 하하.

jQuery가 아닌 답변이 필요한 분들은 다음 사항을 간단히 추가할 수 있습니다.

xmlhttp.setRequest헤더('X-CSRF-Token', $('float[name="floatf-float"). attr('content');

매우 간단한 예를 여기서 확인할 수 있습니다.

xmlhttp.open("POST", example.html", true);
xmlhttp.setRequest머리글('X-CSRF-Token', $('float[name="floatf-float"). attractcontent'));
xmlhttp.send();

Uploadify 및 Rails 3.2와 관련된 도움이 필요한 사람이 있다면(이 게시물을 구글링했을 때의 나처럼), 이 샘플 앱이 도움이 될 수 있습니다: https://github.com/n0ne/Uploadify-Carrierwave-Rails-3.2.3/blob/master/app/views/pictures/index.html.erb

또한 이 앱에서 컨트롤러 솔루션을 확인합니다.

Rails 4.2.4를 사용하고 있는데 왜 다음을 얻었는지 이해하지 못했습니다.

Can't verify CSRF token authenticity

배치도에 있어요

<%= csrf_meta_tags %>

컨트롤러에서:

protect_from_forgery with: :exception

호출중tcpdump -A -s 999 -i lo port 3000(헤더를 설정할 필요가 없음에도 불구하고) 헤더가 설정되는 것을 보여주고 있었습니다.ajaxSetup- 이미 완료됨):

X-CSRF-Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
DNT: 1
Content-Length: 125
authenticity_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

결국 쿠키를 꺼놓았기 때문에 실패하고 말았습니다.쿠키를 활성화하지 않으면 CSRF가 작동하지 않으므로 이 오류가 발생할 수 있습니다.

언급URL : https://stackoverflow.com/questions/7203304/warning-cant-verify-csrf-token-authenticity-rails

반응형