সতর্কতা: সিএসআরএফ টোকেন সত্যতা রেলগুলি যাচাই করতে পারে না


238

আমি এজেএক্সের সাথে নিয়ন্ত্রকের কাছে ভিউ থেকে ডেটা পাঠাচ্ছি এবং এই ত্রুটিটি পেয়েছি:

সতর্কতা: সিএসআরএফ টোকেন সত্যতা যাচাই করতে পারে না

আমি মনে করি আমাকে ডেটা সহ এই টোকেনটি প্রেরণ করতে হবে।

কেউ কি জানেন কীভাবে আমি এটি করতে পারি?

সম্পাদনা: আমার সমাধান

আমি এজেএক্স পোস্টের মধ্যে নিম্নলিখিত কোডটি রেখে এটি করেছি:

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

7
আপনার লেআউট শিরোনামে আপনার কি <% = csrf_meta_tag%> আছে?
আনাতলি

হ্যাঁ এর মতো: <% = csrf_meta_tags%>
kbaccouche

6
আপনার কাছে কি jquery- রেল লাইব্রেরি আছে যা এজাক্স ক্লায়েন্ট-সাইড কার্যকারিতা সরবরাহ করে?
আনাতলি

2
এবং এইচএএমএল উপায় হল "= csrf_meta_tags" যুক্ত করা
এজ আক্পিনার

সুন্দর প্রশ্ন, জিজ্ঞাসা করার জন্য ধন্যবাদ
AMIC MING

উত্তর:


374

আপনার এটি করা উচিত:

  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')
  }
});

5
ধন্যবাদ! মোহন মত আমার জন্য কাজ!
মিশা মোরোশকো

35
রেল দল দ্বারা সরবরাহিত জিকুয়েরি ইউজেএস লাইব্রেরিটি স্বয়ংক্রিয়ভাবে jQuery AJAX অনুরোধে সিএসআরএফ টোকেন যুক্ত করে। README তে কীভাবে সেটআপ পাবেন সে সম্পর্কে নির্দেশাবলী রয়েছে। github.com/rails/jquery-ujs/blob/master/src/rails.js#L91
জেমস কনরোয়-ফিন

1
নোট করুন যে আপনি requests .ajaxSetup ফাংশন দিয়ে একবারে সমস্ত অনুরোধের জন্য শিরোনাম সেট করতে পারেন।
পিটার জঙ্গসমা

1
অসাধারণ! এই উত্তরের জন্য কিছুক্ষণ অনুসন্ধান করা হয়েছে। নির্বিঘ্নে কাজ করে। ধন্যবাদ!
cassi.lup

4
একটি নোট হিসাবে, আপনি যদি উপরে বর্ণিত jQuery ইউজেএস ব্যবহার করে থাকেন তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে রেল-উজগুলি অন্তর্ভুক্ত জ্যাকুয়েরির অন্তর্ভুক্ত হওয়ার পরে আসে বা এটি অপের মতো একই ত্রুটির সাথে ব্যর্থ হবে।
তোফার ফ্যাঙ্গিও

31

এটি <%= form_authenticity_token.to_s %>করার সর্বোত্তম উপায়টি হ'ল সরাসরি আপনার রেল কোডে টোকন প্রিন্ট করতে ব্যবহার করা। সিএসআরএফ টোকেনের জন্য অন্যান্য পোস্টগুলির উল্লেখ হিসাবে ডোম অনুসন্ধান করার জন্য আপনাকে জাভাস্ক্রিপ্ট ব্যবহার করতে হবে না। কেবল নীচের মতো শিরোনাম বিকল্প যুক্ত করুন;

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

7
প্রতিটি এজাক্স কমান্ডের জন্য এটি না করে আপনি $ .ajaxSetup () এ শিরোনাম যুক্ত করতে পারেন ।
স্কট ম্যাকমিলিন

1
আমি বরং এই উত্তরটি ব্যবহার করার সুপারিশ করব ...
অপসিডাও

14
আমি জাভাস্ক্রিপ্টে ইআরবি ব্যবহারের পদ্ধতির পছন্দ করি না।
র‌্যাডিকশাউন্ড

এটি আপনাকে ERB দিয়ে আপনার জাভাস্ক্রিপ্ট তৈরি করতে বাধ্য করে, যা খুব সীমাবদ্ধ। এমনকি যদি এমন জায়গাগুলিও রয়েছে যেখানে ERB ভাল ফিট হতে পারে তবে এমন আরও কিছু জায়গা রয়েছে যেখানে এটি নেই, এবং টোকেনটি পেতে এটি যুক্ত করা কোনও অপচয় হবে।
সকমনক

22

যদি আমি সঠিকভাবে মনে রাখি তবে এই সমস্যা থেকে মুক্তি পেতে আপনাকে আপনার ফর্মটিতে নিম্নলিখিত কোডটি যুক্ত করতে হবে:

<%= token_tag(nil) %>

প্যারামিটারটি ভুলে যাবেন না।


8
আসলে, এই হওয়া উচিত: <%= token_tag(nil) %>। তারপরে আপনি স্বতঃ উত্পাদিত টোকেন পাবেন।
szeryf

15

সত্যই সহজ উপায়। শিরোনাম পরিবর্তন করে বিরক্ত করবেন না।

নিশ্চিত করো যে তোমার আছে:

<%= 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);
    }
});

আমার ইনপুট ফর্মটিতে লুকানো ইনপুট ক্ষেত্রটি যুক্ত করা আমার সমস্যার সমাধান করেছে।
তেমু লইস্তি

আপনি যদি রেলের 'ফর্ম সহায়ক' ব্যবহার করেন তবে এটি স্বয়ংক্রিয়ভাবে সম্পন্ন হবে।
জেসন এফবি

13

সিএসআরএফ মেটা ট্যাগ সহ কোনও পুরানো অ্যাপ্লিকেশন থেকে 3.1 রেলগুলিতে আপগ্রেড করা এখনও এটিকে সমাধান করছে না। রুবিওনরইলস.আরোগ.আরোগ ব্লগে, তারা কিছু আপগ্রেড টিপস দেয় এবং বিশেষত এই জেকুরির লাইনটি যা আপনার লেআউটের প্রধান অংশে যেতে হবে:

$(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-protication-bypass-in-ruby-on-rails

আমার ক্ষেত্রে, প্রতিটি এজাক্স অনুরোধের ভিত্তিতে সেশনটি পুনরায় সেট করা হচ্ছে। উপরের কোড যুক্ত করা সমস্যার সমাধান করেছে।


10
  1. <%= csrf_meta_tag %>আপনার লেআউটে রয়েছে তা নিশ্চিত করুন
  2. beforeSendশিরোনাম সেট করার জন্য এজ্যাক্স অনুরোধে সিএসআরএফ-টোকেন অন্তর্ভুক্ত করতে একটি যুক্ত করুন । এটি কেবল postঅনুরোধের জন্য প্রয়োজনীয় ।

সিএসআরএফ-টোকেন পড়ার কোডটি পাওয়া যায় rails/jquery-ujs, সুতরাং কেবলমাত্র এটি ব্যবহার করা সবচেয়ে সহজ, নীচে:

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

রিলে ইতিমধ্যে অন্তর্ভুক্ত রয়েছে যা পুনরায় বাস্তবায়ন ছাড়াই সহজ। এটি নির্বাচিত উত্তর হওয়া উচিত।
jiehanzheng

headers: { 'X-CSRF-Token': Rails.csrfToken() }
কারাগারে

: @nathanvda, হতে পারে আপনি এই অনুরূপ প্রশ্নের উত্তর দিতে পারেন stackoverflow.com/questions/50159847/...


6

এখানে শীর্ষস্থানীয় ভোট দেওয়া উত্তরগুলি সঠিক তবে আপনি ক্রস-ডোমেন অনুরোধগুলি সম্পাদন করা হলে কাজ করবে না কারণ আপনি jQuery কে সেশন কুকি স্পষ্টভাবে না বললে সেশনটি উপলব্ধ হবে না। এটি কীভাবে করা যায় তা এখানে:

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

আমি কি আপনাকে জিজ্ঞাসা করতে পারি যে আপনি কি খুব অনুরূপ প্রশ্নের উত্তর দিতে পারেন? stackoverflow.com/questions/50159847/...

5

আপনি নীচের মত এটি বিশ্বব্যাপী লিখতে পারেন।

সাধারণ জেএস:

$(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'))
  }

5

ওহো ..

আমি আমার আবেদন.js এ নিম্নলিখিত লাইনটি মিস করেছি

//= require jquery_ujs

আমি এটি এবং এর কাজ প্রতিস্থাপন করেছি ..

======= আপডেট ==========

5 বছর পরে, আমি একই ত্রুটির সাথে ফিরে এসেছি, এখন আমার কাছে রয়েছে নতুন রেলগুলি 5.1.6 এবং আমি আবার এই পোস্টটি পেয়েছি। জীবনের বৃত্তের মতোই।

এখন সমস্যাটি কী ছিল: জেলগুলি 5.1 ডিফল্টভাবে jquery এবং jquery_ujs সমর্থন সরিয়ে নিয়েছে এবং যুক্ত হয়েছে

//= require rails-ujs in application.js

এটি নিম্নলিখিত জিনিসগুলি করে:

  1. বিভিন্ন ক্রিয়াকলাপের জন্য জোরপূর্বক নিশ্চিতকরণ ডায়ালগ;
  2. হাইপারলিঙ্কগুলি থেকে নন-জিইটি অনুরোধ করুন;
  3. ফর্মগুলি তৈরি করুন বা হাইপারলিঙ্কগুলি আজাক্সের সাথে অ্যাসিঙ্ক্রোনালি ডেটা জমা দিন;
  4. ডাবল-ক্লিকিং রোধ করার জন্য জমা দেওয়া বোতামগুলি ফর্ম জমা দিতে স্বয়ংক্রিয়ভাবে অক্ষম হয়ে গেছে। (থেকে: https://github.com/rails/rails-ujs/tree/master )

তবে কেন এটি এজাক্স অনুরোধের জন্য সিএসআরএফ টোকেনকে অন্তর্ভুক্ত করছে না? কেউ যদি এ সম্পর্কে বিস্তারিত জানেন তবে কেবল আমার মন্তব্য করুন। আমি ওটার তারিফ করি.

যাইহোক আমি এটিকে কাজ করতে আমার কাস্টম জেএস ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করেছি (আমাকে এই কোডে পৌঁছাতে সহায়তা করার জন্য অন্যান্য উত্তরের জন্য ধন্যবাদ):

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

এটি আমার পাশাপাশি করার দরকার ছিল। এর কারণটি সামনে আসার কারণ হ'ল আমি বিদ্যমান রেলস অ্যাপটি ধীরে ধীরে প্রতিস্থাপন করতে একটি প্রতিক্রিয়া অ্যাপ তৈরি করছি। যেহেতু বিদ্যমান অ্যাপ্লিকেশনে গুচ্ছ জাভাস্ক্রিপ্টের গোলমাল চলছে, তাই আমি একটি ভিন্ন লেআউট তৈরি করেছি যা একটি ভিন্ন জাভাস্ক্রিপ্ট ফাইল অ্যাক্সেস করে, তবে আমি অন্তর্ভুক্ত করতে ব্যর্থ হয়েছি jquery_ujs। সেই কৌশলটি ছিল।
উইলিয়াম জড

1
হ্যাঁ, কখনও কখনও যদি আমরা যদি এটি মিস করি যে পুনরায় কাজ করার সময়, কিছু রিফ্যাক্টর ... যা ভুল হচ্ছে তা খুঁজে পাওয়া শক্ত। যেহেতু আমরা এটিকে কাজ করতে ম্যানুয়ালি কিছুই করছি না, এতে স্বয়ংক্রিয়ভাবে রেলগুলি অন্তর্ভুক্ত রয়েছে। আমরা এটি ইতিমধ্যে মনে করি। এই জাতীয় সামাজিক যোগাযোগ সংখ্যা / আনস সাইটগুলির জন্য ধন্যবাদ
অভি

: হয়তো আপনি এই অনুরূপ প্রশ্নের উত্তর দিতে পারেন stackoverflow.com/questions/50159847/...

4

আপনি jQuery ব্যবহার না করেন তাহলে এরকম কিছু ব্যবহার আনা অনুরোধ জন্য 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)
    })

আমি কি আপনাকে জিজ্ঞাসা করতে পারি যে আপনি কি খুব অনুরূপ প্রশ্নের উত্তর দিতে পারেন? stackoverflow.com/questions/50159847/...

4

Jquery.csrf ( 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);


5.1 তে ওয়েবপ্যাক ব্যবহার করে //= require jquery.csrf, ঠিক কাজ হচ্ছে না ?. পরিবর্তে আমি এতে প্যাক জেএস ফাইল ব্যবহার import 'jquery.csrf'করেছি। দ্রষ্টব্য আপনার নিজের ভিউগুলিতে একটি প্যাক ট্যাগ সহ এটি অন্তর্ভুক্ত করার দরকার নেই।
ড্যামিয়েন জাস্টিন Šutevski

3

আপনি যদি আপনার ফর্মের টোকেন তৈরি করতে jQuery সহ জাভাস্ক্রিপ্ট ব্যবহার করছেন তবে এটি কাজ করে:

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

স্পষ্টতই, আপনার <%= csrf_meta_tag %>আপনার রুবি বিন্যাসে থাকা দরকার।


2

আপনার যেগুলির জন্য একটি নন jQuery উত্তর প্রয়োজন তাদের জন্য আপনি নিম্নলিখিতগুলি যুক্ত করতে পারেন:

xmlhttp.setRequestHeader ('এক্স-সিএসআরএফ-টোকেন', $ ('মেটা [নাম = "সিএসআরএফ-টোকেন"]')। অ্যাটর ('সামগ্রী'));

খুব সাধারণ উদাহরণ এখানে সেন হতে পারে:

xmlhttp.open ( "পোষ্ট", "example.html", সত্য);
xmlhttp.setRequestHeader ('এক্স-সিএসআরএফ-টোকেন', $ ('মেটা [নাম = "সিএসআরএফ-টোকেন"]')। অ্যাটর ('সামগ্রী'));
xmlhttp.send ();

6
এটি কি নির্বাচকদের জন্য jQuery ব্যবহার করে না?
ইউলে

2

আমি এই সমস্যাটি নিয়ে কয়েকদিন লড়াই করেছি। কোনও জিইটি কল সঠিকভাবে কাজ করছে, তবে সমস্ত পুটগুলি একটি "সিএসআরএফ টোকেন সত্যতা যাচাই করতে পারে না" ত্রুটি উত্পন্ন করবে। আমি 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; 
}

"প্রক্সি_সেট_হেডার এক্স-ফরওয়ার্ড-প্রোটো https;" অন্তর্ভুক্ত করার পরে, আমার সমস্ত সিএসআরএফ টোকন ত্রুটি ছেড়ে গেছে।

আশা করি এটি অন্য কাউকে সহায়তা করে যারা প্রাচীরের বিরুদ্ধেও মাথা পিটিয়ে চলেছে। হা হা


1

যদি কারও যদি আপলোড এবং রেল ৩.২ (যেমন আমি এই পোস্টটি গুগল করেছিলাম তখন আমার মতো) সম্পর্কিত সাহায্যের প্রয়োজন হয়, এই নমুনা অ্যাপটি সহায়ক হতে পারে: https://github.com/n0ne/Uploadify- ক্যারিয়ার ওয়েভ- রেইলস ৩.২.৩ / ব্লব / মাস্টার /app/views/pictures/index.html.erb

এছাড়াও এই অ্যাপ্লিকেশনটিতে নিয়ামক সমাধান পরীক্ষা করে দেখুন


0

আমি 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

শেষ পর্যন্ত এটি ব্যর্থ হয়েছিল কারণ আমার কুকিগুলি বন্ধ ছিল। সিএসআরএফ কুকিজ সক্ষম না করা ছাড়া কাজ করে না, সুতরাং যদি আপনি এই ত্রুটিটি দেখেন তবে এটি অন্য সম্ভাব্য কারণ।


এটা খুব হেল্পফু!
জোহোয়াং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.