রেলস: কোনও পোষ্ট অনুরোধ করার সময় সিএসআরএফ টোকেন সত্যতা যাচাই করতে পারে না


91

আমি POST requestআমার স্থানীয় দেবকে এইভাবে তৈরি করতে চাই:

  HTTParty.post('http://localhost:3000/fetch_heroku',
                :body => {:type => 'product'},)

তবে সার্ভার থেকে এটি রিপোর্ট করে reports

Started POST "/fetch_heroku" for 127.0.0.1 at 2016-02-03 23:33:39 +0800
  ActiveRecord::SchemaMigration Load (0.0ms)  SELECT "schema_migrations".* FROM "schema_migrations"
Processing by AdminController#fetch_heroku as */*
  Parameters: {"type"=>"product"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 1ms

এখানে আমার নিয়ামক এবং রুট সেটআপ, এটি বেশ সহজ।

  def fetch_heroku
    if params[:type] == 'product'
      flash[:alert] = 'Fetch Product From Heroku'
      Heroku.get_product
    end
  end

  post 'fetch_heroku' => 'admin#fetch_heroku'

আমি নিশ্চিত যে আমার কী করা দরকার? সিএসআরএফ বন্ধ করা অবশ্যই কাজ করবে তবে আমি মনে করি এ জাতীয় এপিআই তৈরি করার সময় এটি আমার ভুল হওয়া উচিত।

আমার আর কোন সেটআপ করার দরকার নেই?


4
এপিআইগুলির জন্য সাধারণত সিএসআরএফ টোকেন বৈধতা বন্ধ করতে গৃহীত হয় । আমি ব্যবহার protect_from_forgery with: :null_session
দাসতরী

উত্তর:


110

ক্রস সাইটের অনুরোধ জালিয়াতি (সিএসআরএফ / এক্সএসআরএফ) হ'ল যখন কোনও দূষিত ওয়েব পেজ ব্যবহারকারীরা অনুরোধ সম্পাদন করতে কৌশল করে যা উদাহরণস্বরূপ বুকমার্কলেট, আইফ্রেম ব্যবহার করে বা কেবল এমন একটি পৃষ্ঠা তৈরি করে যা ব্যবহারকারীদের বোকামির জন্য দৃশ্যত যথেষ্ট অনুরূপ হয়।

পাগল CSRF সুরক্ষা "শাস্ত্রীয়" ওয়েব অ্যাপ্লিকেশানগুলি জন্য তৈরি করা হয় - এটা কেবল আশ্বাস একটি ডিগ্রী যে অনুরোধ আপনার নিজস্ব ওয়েব অ্যাপ্লিকেশন থেকে সম্ভূত দেয়। একটি সিএসআরএফ টোকেন একটি গোপনের মতো কাজ করে যা কেবল আপনার সার্ভারই ​​জানে - রেলগুলি একটি এলোমেলো টোকেন উত্পন্ন করে এবং এটি সেশনে সংরক্ষণ করে। আপনার ফর্মগুলি একটি লুকানো ইনপুটের মাধ্যমে টোকেন প্রেরণ করে এবং রেলগুলি যাচাই করে যে কোনও জিইটি-র অনুরোধে একটি টোকেন অন্তর্ভুক্ত রয়েছে যা সেশনে সংরক্ষিত রয়েছে তার সাথে মেলে।

তবে একটি এপিআই সাধারণত সংজ্ঞা ক্রস সাইট দ্বারা হয় এবং এটি আপনার ওয়েব অ্যাপের চেয়ে বেশি ব্যবহৃত হতে পারে যার অর্থ সিএসআরএফের পুরো ধারণাটি যথেষ্ট প্রযোজ্য নয়।

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

@ ডেসটরি দ্বারা চিহ্নিত হিসাবে আপনি সিএসআরএফ নিষ্ক্রিয় করতে পারেন:

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

আপডেট হয়েছে। 5 রেলগুলিতে আপনি কেবলমাত্র --apiঅপশনটি ব্যবহার করে এপিআই তৈরি করতে পারেন :

rails new appname --api

তারা সিএসআরএফ মিডলওয়্যার এবং আরও অনেক উপাদান যা সুপারফ্লাউস অন্তর্ভুক্ত করে না।


: ধন্যবাদ, আমি CSRF বন্ধ অংশ চালু করতে চয়ন stackoverflow.com/questions/5669322/...
cqcn1991

4
এটি পরামর্শ দেয় যে সমস্ত এপিআই অ্যাপ্লিকেশন-থেকে-অ্যাপ্লিকেশন ট্র্যাফিক দেয় (যেখানে একক অংশীদারকে একটি অনন্য কী এবং গোপনীয়তা জারি করা হয়)। সেই পরিস্থিতিতে, একটি সার্ভার-থেকে-সার্ভার যোগাযোগের মতো, এই উত্তরটি উপযুক্ত। যাইহোক, বেশিরভাগ ওয়েব অ্যাপ্লিকেশন বিকাশকারীদের কাছে বিভ্রান্তিকর বিষয়টি হ'ল যে কোনও জাভাস্ক্রিপ্ট ক্লায়েন্টের জন্য, আপনার দ্বারা নিয়ন্ত্রিত এবং রচিত, আপনি একটি একক কী-গোপন ব্যবহার করতে চান না (এটি সমস্ত ক্লায়েন্টের কাছে একটি একক কী-গোপন প্রকাশ করবে)। পরিবর্তে, রেলের সিএসআরএফ এবং কুকি সেশন মেকানিজম দুর্দান্তভাবে কাজ করে - এমনকী জাভাস্ক্রিপ্ট অ্যাপ্লিকেশনগুলির জন্য যা আপনার এপিআই ব্যবহার করে— যদি আপনি প্রতিটি অনুরোধের সাথে সিএসআরএফ টোকেনটিকে পুনরায় ব্যয় করেন।
জেসন এফবি

আপনি এজেএক্সে যেভাবে করেন তা এই এসও পোস্টে বর্ণনা করা হয়েছে স্ট্যাকওভারফ্লো
জেসন এফবি

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

আপনি যদি সিএসআরএফের বিকল্প সরবরাহ করেন বা তৈরি করেন তবে আমার অতিথি হোন। আপনি কী প্রতিস্থাপন করছেন তার কারণটি কেবল জানেন যাতে আপনি এটির সাথে প্রতিস্থাপনের জন্য উপযুক্ত কি তা জানেন। স্পষ্টতই, এখন আমাদের কোঁচল প্রাসঙ্গিক হয়ে উঠেছে।
জেসন এফবি

78

সিএসআরএফ বন্ধ করার আরেকটি উপায় যা নাল সেশনটি সরবরাহ করে না তা যুক্ত করা হল:

skip_before_action :verify_authenticity_token

আপনার রেল কন্ট্রোলারে। এটি নিশ্চিত করবে আপনার এখনও সেশন তথ্য অ্যাক্সেস আছে।

আবার, নিশ্চিত হয়ে নিন যে আপনি এটি কেবলমাত্র API কন্ট্রোলারগুলিতে বা অন্যান্য জায়গাগুলিতে যেখানে সিএসআরএফ সুরক্ষা যথেষ্ট প্রয়োগ হয় না do


4
এটা কি একই রকম protect_from_forgery except: [:my_method_name]?
আর্নল্ড রোয়া

19

Api.rubyonrails.org এপিআই কন্ট্রোলারের ক্ষেত্রে সিএসআরএফের একটি কনফিগারেশন সম্পর্কিত প্রাসঙ্গিক তথ্য রয়েছে :

এটি মনে রাখা জরুরী যে এক্সএমএল বা জেএসওন অনুরোধগুলিও প্রভাবিত হয়েছে এবং আপনি যদি একটি এপিআই বানাচ্ছেন তবে আপনার জালিয়াতি সুরক্ষা পদ্ধতিটি ApplicationController(ডিফল্টরূপে :exception) পরিবর্তন করা উচিত :

class ApplicationController < ActionController::Base
  protect_from_forgery unless: -> { request.format.json? }
end

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


4
এটি এত বিভ্রান্তিকর। আমি এমন উত্সগুলিকে দেখছি যা বলে যে protect_from_forgeryএটি এখনও এপিআইগুলির জন্য প্রয়োজনীয়, এবং যে সূত্রগুলি বলে যে এটি তা নয়। যদি API কোনও একক পৃষ্ঠার অ্যাপ্লিকেশানের জন্য থাকে তবে এটি ব্যবহারকারীর প্রমাণীকরণের জন্য সেশন কুকি ব্যবহার করে?
উইলিয়াম জড

সিএসআরএফ প্রক্রিয়াটি সেশন কুকিজ ব্যবহার করে আক্রমণ ভেক্টরকে মোকাবেলার জন্য রেলগুলির অন্তর্নির্মিত উপায়। রেল সেশন কুকির পাশাপাশি (প্রকৃতপক্ষে ভিতরে) কাজ করার সময় প্রক্রিয়াটি আপনার নিয়ন্ত্রণকারীদের সুরক্ষা দেয়। সুরক্ষা_ফর্ম_ফোর্জি, বা এটিকে বন্ধ না করে বা এটি ব্যতীত কোনও সেট না করে, আপনি সিএলআরএফ টোকেন (যা সেশন কুকি থেকে নেওয়া) থেকে তথ্য ব্যবহার করে রেলগুলি সেই পদক্ষেপটি রক্ষা করতে বলছেন না।
জেসন এফবি

4
আমি মনে করি যা বিভ্রান্তিকর তা হ'ল রেলের জন্য ডকুমেন্টেশন "এপিআই" এর অর্থ একটি সার্ভার-টু-সার্ভার অ্যাপ্লিকেশন যা বিশ্বস্ত, দূরবর্তী অংশীদারদের (আপনার সাইটটিতে পরিদর্শন করা সমস্ত ওয়েব ব্যবহারকারী নয়) এপিআই অনুরোধগুলি গ্রহণ করবে। এই পিপিএল-এর জন্য, সুরক্ষিত নন-হ্যাকযোগ্য পদ্ধতির মাধ্যমে অনন্য কী-সিক্রেট জোড়া দিন। আধুনিক ওয়েব অ্যাপ্লিকেশনগুলির জন্য, যেখানে প্রচুর লোকেরা আপনার ওয়েব অ্যাপ্লিকেশনটিকে একটি ওয়েব ক্লায়েন্টের মাধ্যমে লোড করবে, আপনি এখনও আপনার সাইটটি পরিদর্শন করেছেন এমন প্রতিটি ব্যক্তিকে অনন্যভাবে সনাক্ত করতে একটি সেশন বা টোকেন-ভিত্তিক প্রক্রিয়া ব্যবহার করেন use সুতরাং আপনি এটি করার জন্য কিছু অন্যান্য প্রক্রিয়া ব্যবহার না করে (জসন ওয়েব টোকেন ইত্যাদি), রেলের অন্তর্নির্মিত স্টাফের সাথে আটকে থাকুন।
জেসন এফবি

4
আপনি এজেএক্সে যেভাবে করেন তা এই এসও পোস্টে বর্ণনা করা হয়েছে স্ট্যাকওভারফ্লো
জেসন এফবি


3

আপনি যদি নমুনা নিয়ন্ত্রকের নমুনা ক্রিয়াটি বাদ দিতে চান

class TestController < ApplicationController
  protect_from_forgery :except => [:sample]

  def sample
     render json: @hogehoge
  end
end

আপনি কোনও সমস্যা ছাড়াই বাইরে থেকে অনুরোধগুলি প্রক্রিয়া করতে পারেন।


0

সমস্যার সহজতম সমাধান হ'ল আপনার নিয়ামকের মধ্যে স্ট্যান্ডার্ড জিনিসগুলি করা বা আপনি সরাসরি এটিকে অ্যাপ্লিকেশন নিয়ন্ত্রণকারীতে রাখতে পারেন

class ApplicationController < ActionController::Base protect_from_forgery with: :exception, prepend: true end


0

আপনি যদি কেবল এক বা একাধিক নিয়ামক ক্রিয়াকলাপের জন্য (পুরো নিয়ামকের পরিবর্তে) সিএসআরএফ সুরক্ষাটি এড়াতে চান তবে এটি চেষ্টা করে দেখুন

skip_before_action :verify_authenticity_token, only [:webhook, :index, :create]

[:webhook, :index, :create]এই 3 টি ক্রিয়াকলাপের জন্য চেকটি কোথায় এড়িয়ে যাবে, তবে আপনি যে কোনওটি এড়িয়ে যেতে চান তাতে পরিবর্তন করতে পারবেন

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