রেল 4-এ কোনও নিয়ামক বা ক্রিয়াকলাপের জন্য এক্স-ফ্রেম-বিকল্পগুলি কীভাবে ওভাররাইড করা যায়


89

রেলস 4 টি HTTP প্রতিক্রিয়া শিরোনামের SAMEORIGINজন্য একটি ডিফল্ট মান সেট করে to X-Frame-Optionsএটি সুরক্ষার জন্য দুর্দান্ত তবে এটি আপনার অ্যাপ্লিকেশনটির কিছু অংশ অন্য কোনও iframeডোমেনের জন্য উপলব্ধ হতে দেয় না ।

আপনি X-Frame-Optionsবিশ্বব্যাপী config.action_dispatch.default_headersসেটিংটি ব্যবহার করে মানটি ওভাররাইড করতে পারেন :

config.action_dispatch.default_headers['X-Frame-Options'] = "ALLOW-FROM https://apps.facebook.com"

তবে আপনি কীভাবে এটি কেবলমাত্র একটি একক নিয়ামক বা ক্রিয়াকলাপের জন্য ওভাররাইড করবেন?

উত্তর:


137

আপনি যদি শিরোনামটি সম্পূর্ণরূপে সরাতে চান তবে আপনি একটি after_actionফিল্টার তৈরি করতে পারেন :

class FilesController < ApplicationController
  after_action :allow_iframe, only: :embed

  def embed
  end

private

  def allow_iframe
    response.headers.except! 'X-Frame-Options'
  end
end

অথবা, অবশ্যই, আপনি after_actionআলাদা কিছুতে মান সেট করতে কোডটি কোড করতে পারেন :

class FacebookController < ApplicationController
  after_action :allow_facebook_iframe

private

  def allow_facebook_iframe
    response.headers['X-Frame-Options'] = 'ALLOW-FROM https://apps.facebook.com'
  end
end

নোট করুন যে এটিকে ডিবাগ করার সময় আপনার নির্দিষ্ট ব্রাউজারগুলিতে (ক্রোম আমার জন্য) আপনার ক্যাশে সাফ করা দরকার।


আপনি কীভাবে এটি একটি redirect_to এ কাজ করতে পাবেন? (আমার কৌণিক অ্যাপ্লিকেশনটির সাথে এখনই চেষ্টা করছি এবং এটি কাজ করছে না)
কিট্টিমিঙ্কি

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

আমি বুঝতে পারলাম আমার কাছে তা থাকত after_action সামনে এটি চূড়ান্ত নিয়ামক কর্ম থেকে আপনাকে পুনঃনির্দেশিত করা হয় যে রিডাইরেক্ট Angularযাত্রাপথ। ধন্যবাদ!
কিট্টিমিংকি

এটি কোনও ক্ষেত্রে এটি করার প্রয়োজন হয় না after_action, যদিও এটি করা যেমন সহজ হয় তবে এমন কোনও জায়গায় Frontend::BaseControllerযেখানে এটি পুরো সম্মুখভাগে প্রযোজ্য। আপনি পাশাপাশি response.headers.except! ...একটি ক্রিয়া চালাতে পারেন ।
কোডেনার

4
এখন পর্যন্ত, ক্রোমে কাজ করছে না। কনসোল ত্রুটিটি "চাইল্ড 'লোড করার সময়" অবৈধ' এক্স-ফ্রেম-বিকল্পগুলি 'শিরোলেখের মুখোমুখি হয়েছে:' ALLOW-FROM पालक 'কোনও স্বীকৃত নির্দেশ নয়। "শিরোনামটি উপেক্ষা করা হবে।" বিকল্প হিসাবে এই ক্রোমিয়ামে ঠিক হবে না হিসাবে চিহ্নিত হয়েছে: "'ফ্রেম-পূর্বপুরুষ' ক্রোম এবং ফায়ারফক্স উভয় ক্ষেত্রেই প্রেরণ করছে এবং এই কার্যকারিতা সমর্থন করার সঠিক উপায় is" bugs.chromium.org/p/chromium/issues/detail?id=129139
richardkmiller

8

আপনার রেলস অ্যাপ্লিকেশনটিকে কোনও আই-ফ্রেমে এম্বেড করার এবং সমস্যাগুলিতে চলতে দেওয়ার জন্য কীভাবে এই লিঙ্কটি পাওয়া যায় তার জন্য আমি এখানে একটি আপডেট উত্তর অন্তর্ভুক্ত করতে চেয়েছিলাম।

এটি লিখেছেন, মে 2820, এক্স-ফ্রেম-বিকল্প পরিবর্তনগুলি সম্ভবত আপনার সমস্যার সেরা সমাধান নয়। "ALLOW-FROM" বিকল্পটি সমস্ত বড় ব্রাউজার দ্বারা সম্পূর্ণরূপে অনুমোদিত নয়।

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

আপনি ইনিশিয়ালাইজারে (নীচে উদাহরণস্বরূপ) 5.2 কিলের সাথে একটি সামগ্রী-সুরক্ষা-নীতি সেট আপ করতে পারেন এবং << 5.2 জন্য আপনি সুরক্ষিত শিরোনাম রত্নের মতো রত্ন ব্যবহার করতে পারেন: https://github.com/github/secure_headers

আপনি যদি চান তবে একটি নিয়ামক / অ্যাকশন ভিত্তিতে নীতি সম্পর্কিত স্পেসিফিকেশনও ওভাররাইড করতে পারেন।

উন্নত সুরক্ষা সুরক্ষার জন্য সামগ্রী-সুরক্ষা-নীতিগুলি দুর্দান্ত। রেল ডক্সে আপনি কনফিগার করতে পারেন এমন সমস্ত জিনিস দেখুন: https://edgeguides.rubyonrails.org/security.html

বিষয়বস্তু-সুরক্ষা-নীতিমালার জন্য একটি রেলগুলি 5.2 উদাহরণ:

# config/initializers/content_security_policy.rb    
    Rails.application.config.content_security_policy do |policy|
      policy.frame_ancestors :self, 'some_website_that_embeds_your_app.com'
    end

কোনও নীতিতে নিয়ামক নির্দিষ্ট পরিবর্তনের উদাহরণ:

# Override policy inline
class PostsController < ApplicationController
  content_security_policy do |p|
    p.frame_ancestors :self, 'some_other_website_that_can_embed_posts.com'
  end
end

গতিশীল মানগুলির জন্য p.frame_ancestors :self, -> { company&.allowed_domain || 'none' }
ল্যাম্বদাও

আমি ব্যবহার করছি frame_ancestorsএবং এটি প্রতিটি ব্রাউজারে কাজ করে তবে সাফারি। কোন অন্তর্দৃষ্টি?
ম্যাট

@ ম্যাট - আমি বিশ্বাস করি সাফারি বর্তমানে তৃতীয় পক্ষের আইফ্রেমেসকে কুকিজ সংরক্ষণ করতে বাধা দেয় - এটি সাফারিতে আইফ্রেমেস ব্যবহারের একটি প্রধান সীমাবদ্ধতা এবং এটি আপনার সমস্যার কারণ হতে পারে। আমি যতদূর জানি কোনও ভাল কাজের আশপাশ নেই। : আরও তথ্যের জন্য এই স্ট্যাক ওভারফ্লো চেক করুন stackoverflow.com/questions/59723056/...
armont_development

0

5 টি রেলের জন্য, response.set_header('X-Frame-Options', 'ALLOW-FROM https://apps.facebook.com')পরিবর্তে ব্যবহার করুন। অথবা যদি ALLOW-FROMকাজ না করে এবং আপনার দ্রুত সমাধানের প্রয়োজন হয় তবে আপনি এটি সেট করতে পারেনALLOWALL

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