4 টি প্রামাণ্য টোকেন


198

যখন আমি কিছু সত্যতা টোকেন সমস্যার মধ্যে পড়েছিলাম তখন আমি একটি নতুন রেলস 4 অ্যাপে (রুবি ২.০.০-পি0 তে) কাজ করছিলাম।

জসনকে (সাধ্যের respond_toপদ্ধতি ব্যবহার করে ) সাড়া দেয় এমন একটি কন্ট্রোলার লেখার সময় , আমি যখন রেকর্ডটি ব্যবহার করে তৈরি করার চেষ্টা করেছি তখন আমি ব্যতিক্রম হতে createশুরু ActionController::InvalidAuthenticityTokenকরেছিলাম curl

আমি নিশ্চিত করেছি যে আমি সেট করেছি -H "Content-Type: application/json"এবং আমি ডেটা সেট করেছি -d "<my data here>"তবে এখনও ভাগ্য নেই।

আমি একই নিয়ামকটি রেল ৩.২ (রুবি ১.৯.৩ তে) ব্যবহার করে লেখার চেষ্টা করেছি এবং যা-ই হোক না কেন আমি কোনও সত্যতার টোকেন সমস্যা পাইনি। আমি আশেপাশে অনুসন্ধান করেছিলাম এবং দেখেছি R রেলগুলিতে সত্যতা টোকেনের সাথে কিছু পরিবর্তন হয়েছে যা আমি বুঝতে পারি সেগুলি থেকে আর সেগুলি আর স্বয়ংক্রিয়ভাবে ফর্মগুলিতে sertedোকানো হয় না? আমি মনে করি এটি কোনওভাবে এইচটিএমএল-বিহীন বিষয়বস্তুর প্রকারকে প্রভাবিত করছে।

এইচটিএমএল ফর্মের অনুরোধ না করে, সত্যতা টোকেনটি ছিনিয়ে নেওয়া, তারপরে সেই টোকেন দিয়ে অন্য অনুরোধ না করে এটিকে ঘুরে দেখার কী কোনও উপায় আছে? বা আমি কি সম্পূর্ণরূপে সুস্পষ্ট এমন কিছু মিস করছি?

সম্পাদনা: আমি কিছু পরিবর্তন না করে একটি স্ক্যাফোল্ড ব্যবহার করে একটি নতুন রেলস 4 অ্যাপে নতুন রেকর্ড তৈরি করার চেষ্টা করেছি এবং আমি একই সমস্যায় পড়ছি তাই আমি অনুমান করি এটি আমার করা কিছু নয়।

উত্তর:


277

আমি মনে করি আমি এটি সন্ধান করেছি। আমি (নতুন) ডিফল্ট পরিবর্তন করেছি

protect_from_forgery with: :exception

প্রতি

protect_from_forgery with: :null_session

মতামত অনুসারে ApplicationController

# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.

request_forgery_protecton.rbনিম্নোক্ত রেখাগুলির জন্য উত্সটি অনুসন্ধান করুন বা আরও সুনির্দিষ্টভাবে আপনি এই পার্থক্যটি দেখতে পাচ্ছেন :

ইন পাগল 3.2 :

# This is the method that defines the application behavior when a request is found to be unverified.
# By default, \Rails resets the session when it finds an unverified request.
def handle_unverified_request
  reset_session
end

ইন পাগল 4 :

def handle_unverified_request
  forgery_protection_strategy.new(self).handle_unverified_request
end

যা নিম্নলিখিতগুলি কল করবে :

def handle_unverified_request
  raise ActionController::InvalidAuthenticityToken
end

20
আপনি সমস্তটি একসাথে বিকল্পটি সরিয়ে ফেলতে পারেন: নাল_অ্যাসেশনটি ডিফল্ট: api.rubyonrails.org/classes/ActionController/…
কেসি

6
নন-জেএসএন কল এবং জেএসএন কলগুলির জন্য নাল সেশনের জন্য ব্যতিক্রম করার কোনও উপায় আছে (ওরফে এপিআই কল)?
জেমস ম্যাকমাহন

@ জেমসম্যাকমাহন আপনি নিজের লেখা লিখতে সক্ষম হতে পারেন before_actionযা ফর্ম্যাটটি পরীক্ষা করে এবং অনুরোধটি যাচাই করা হয়েছে কিনা। শর্ত নির্ধারণের পথে আমি কোনও বিলম্বিত জানি না।
আলেক্সকো

1
৪.১..6 রেলগুলিতে, আমাকে skip_before_action :verify_authenticity_tokenএই অ্যাপ্লিকেশনটির অ্যাপ্লিকেশন নিয়ামককেও এই কাজটি করার জন্য নির্দিষ্ট করতে হয়েছিল।
ওয়াসিম

1
:verify_authenticy_tokenআরেল ৪.২ এ আপনাকে আর নিষ্ক্রিয় করতে হবে না । এটি ডিফল্ট :null_session, নাম হিসাবে বোঝা যায় যে সেশন ছাড়াই কেবল আপনাকে একটি অনুরোধ দেয়। পরিবর্তে আপনি একটি API কী এর মাধ্যমে অনুরোধটি যাচাই করতে পারেন।
লোবাতি

72

সিএসআরএফ সুরক্ষা বন্ধ না করে ফর্মের সাথে নিম্নলিখিত কোডের লাইনটি যুক্ত করা ভাল

<%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %> 

এবং যদি আপনি ফর্মটি তৈরি করতে form_for বা form_tag ব্যবহার করেন তবে তা স্বয়ংক্রিয়ভাবে ফর্মের উপরের কোডের লাইনটি যুক্ত করবে


9
আপনি যদি কোনও ফর্ম তৈরি করে থাকেন তবে এটি ভাল পরামর্শ, তবে প্রশ্নটি জেএসএন ব্যবহার করে এপিআই কল করার বিষয়ে উল্লেখ করছে।
জেমস ম্যাকমাহন

1
যদিও আপনাকে ধন্যবাদ, এটি হ্যান্ডেলবারগুলি ব্যবহার করার সময় একটি কোড হাতে লেখার বিষয়ে আমার একটি প্রশ্নের উত্তর দিয়েছিল!
ডেভিড রাউটেন

70

ফর্মটিতে নিম্নলিখিত লাইনটি যুক্ত করা আমার পক্ষে কাজ করেছে:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

12
সত্যই এপিআই কলগুলিতে প্রযোজ্য না
আদালতসমাজ

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

2
আমার কারাগারের জন্য .8.০.৮ ভিত্তিক অ্যাপ্লিকেশন এটি লেখার জন্য যথেষ্ট ছিল =token_tag nilবা (.b)<%= token_tag nil %>
jmarceli

1
আপনি টোকেনটি শূন্য করে সেট করে প্রমাণীকরণ অক্ষম করছেন বলে মনে হচ্ছে?
কার্লোস

এটি করা কি নিরাপদ?
এঞ্জেল গার্সিয়া

33

যতক্ষণ না আপনি একচেটিয়াভাবে API প্রয়োগ করেন না ততক্ষণ সিএসআরএফ সুরক্ষা বন্ধ করা ভাল বলে আমি মনে করি না।

অ্যাকশনকন্ট্রোলারের জন্য রেলস 4 এপিআই ডকুমেন্টেশনের দিকে তাকানোর সময় আমি জানতে পেরেছি যে আপনি প্রতি নিয়ামক বা প্রতি পদ্ধতি বেসের উপর জালিয়াতি সুরক্ষা বন্ধ করতে পারেন।

উদাহরণস্বরূপ আপনি যে পদ্ধতিগুলি ব্যবহার করতে পারেন তার জন্য সিএসআরএফ সুরক্ষা বন্ধ করতে

class FooController < ApplicationController
  protect_from_forgery except: :index

এটি আমার জন্য রেল 4 এ করেছে - মুছে ফেলার চেষ্টা করার পরে ত্রুটি নিক্ষেপ করা হচ্ছে। ^^
শূন্য_কুল

9

একই সমস্যা জুড়ে এসেছিল। আমার নিয়ামক যোগ করে এটি স্থির করে:

      skip_before_filter :verify_authenticity_token, if: :json_request?

অপরিজ্ঞাত পদ্ধতি `json_request? ' # <সেটিংসকন্ট্রোলার: 0x000000030a54a8>, কোনও ধারণা?
দেওনো

আপনাকে সেখানে কোনও পদ্ধতিটি সংজ্ঞায়িত করতে হবে: Def json_request? request.format.json? শেষ
জয় কুমার রাজপুত

7

তুমি কি চেষ্টা করেছিলে?

 protect_from_forgery with: :null_session, if: Proc.new {|c| c.request.format.json? }

4

এই সরকারী ডক - কিভাবে API- এর জন্য জালিয়াতি সুরক্ষা বন্ধ করতে সঠিকভাবে সম্পর্কে আলোচনা http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html


1
এটি সত্য, তবে উত্তরটি ২০১৩ থেকে - এবং বিষয়গুলি পরিবর্তিত হয়। এবং আপনার আনুষ্ঠানিকভাবে গৃহীত উত্তরটি ভাল - আমার লিঙ্কটি
বিষয়টির


2

এই বৈশিষ্ট্যগুলি সুরক্ষা এবং জালিয়াতি সুরক্ষা উদ্দেশ্যে যুক্ত করা হয়েছিল।
যাইহোক, আপনার প্রশ্নের উত্তর দিতে, এখানে কিছু ইনপুট রয়েছে। আপনার নিয়ামকের নামের পরে আপনি এই লাইনগুলি যুক্ত করতে পারেন।

তাই ভালো,

class NameController < ApplicationController
    skip_before_action :verify_authenticity_token

রেলের বিভিন্ন সংস্করণের জন্য এখানে কয়েকটি লাইন দেওয়া আছে।

রেল 3

skip_before_filter: যাচাই_আপনার_পরিচয়_ টোকেন

রেল 4 :

এড়িয়ে যান_আপনি_অ্যাকটিশন: যাচাই_আপনার_পরে


আপনি সব নিয়ামক রুটিন এই নিরাপত্তা বৈশিষ্ট্য নিষ্ক্রিয় করতে চায়, তবে আপনি এর মান পরিবর্তন করতে পারেন protect_from_forgery করার null_session: আপনার application_controller.rb ফাইলে।

তাই ভালো,

class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session
end

1

আপনি যদি রেল দিয়ে jQuery ব্যবহার করেন তবে সত্যতা টোকেন যাচাই না করে পদ্ধতিতে প্রবেশের অনুমতি দেওয়ার বিষয়ে সতর্ক হন।

jquery-ujs আপনার জন্য টোকেন পরিচালনা করতে পারে

আপনার এটি ইতিমধ্যে জ্যাকোরি-রেল রত্নের অংশ হিসাবে থাকা উচিত তবে আপনাকে এটিকে অ্যাপ্লিকেশন.জেজে অন্তর্ভুক্ত করতে হতে পারে

//= require jquery_ujs

আপনার যা প্রয়োজন তা - আপনার এজাক্স কলটি এখন কাজ করা উচিত

আরও তথ্যের জন্য, দেখুন: https://github.com/rails/jquery-ujs



0

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

<form accept-charset="UTF-8" action="/login/signin" method="post">
  <div style="display:none">
    <input name="utf8" type="hidden" value="&#x2713;" />
    <input name="authenticity_token" type="hidden" value="x37DrAAwyIIb7s+w2+AdoCR8cAJIpQhIetKRrPgG5VA=">
  </div>
    ...
</form>

সুতরাং সমস্যার সমাধানটি হ'ল হয় সত্যতা_ টোকেন ক্ষেত্র যুক্ত করা বা রেল ফর্ম সহায়ক ব্যবহারের পরিবর্তে সুরক্ষার সাথে আপস করা ইত্যাদি to


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

যদি না অনুরোধের বিষয়বস্তুটি আসলে JSON না হয় তবে আপনি সেট করতে চান application/json
অ্যালেক্সকো

আমি বুঝতে পেরেছি উত্তরটি আপনি যা খুঁজছেন ঠিক তা নয়। তবে সম্পর্কিত উত্তর দেওয়ার উদ্দেশ্য হ'ল অনুরূপ "সত্যতা সম্পর্কিত সমস্যাগুলি" অনুসন্ধান করা ব্যবহারকারীদের সহায়তা করা।
আমজাদ

দুঃখিত আমি ভুল করে মুছে ফেলেছি - "আপনি সামগ্রীর ধরণ সেট করতে পারেন: উপরের সমাধান সহ অ্যাপ্লিকেশন / x-www-form-urlencoded"।
আমজাদ

0

আমার সমস্ত পরীক্ষা ঠিকঠাক ছিল। তবে কোনও কারণে আমি আমার পরিবেশকে পরিবর্তনযোগ্য নয় এমন স্থির করে দিয়েছিলাম:

export RAILS_ENV=something_non_test

আমি এই পরিবর্তনশীলটি আনসেট করতে ভুলে গিয়েছিলাম যার কারণে আমি ActionController::InvalidAuthenticityTokenব্যতিক্রম পেতে শুরু করেছি ।

আনসেট করার পরে $RAILS_ENV, আমার পরীক্ষাগুলি আবার কাজ শুরু করে।

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