रेल्स 4 में कंट्रोलर या एक्शन के लिए एक्स-फ्रेम-ऑप्शंस को ओवरराइड कैसे करें


88

HTTP प्रतिक्रिया हैडर के SAMEORIGINलिए रेल्स 4 एक डिफ़ॉल्ट मान सेट करता है 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

ध्यान दें कि आपको इसे डीबग करते समय कुछ ब्राउज़रों (मेरे लिए Chrome) में अपना कैश साफ़ करने की आवश्यकता है।


आपको यह पुनर्निर्देशित करने के लिए कैसे मिलेगा? (मेरे कोणीय ऐप के साथ अभी कोशिश कर रहा हूं और यह काम नहीं कर रहा है)
kittyminky

मुझे लगता है कि दोनों कार्रवाई redirect_toऔर कार्रवाई है कि यह पुनर्निर्देशित करने के लिए इसे लागू करने की आवश्यकता होगी। क्या आपको कोई विशेष त्रुटि मिल रही है? स्टैक ओवरफ्लो पर एक अच्छा नया प्रश्न लगता है!
क्रिस पीटर्स

मुझे एहसास हुआ कि मार्गों पर पुनर्निर्देशित करने वाली अंतिम नियंत्रक कार्रवाई के लिए पुनर्निर्देशित after_action होने से पहले मेरे पास था Angular। धन्यवाद!
kittyminky

यह एक में ऐसा करने के लिए आवश्यक नहीं है after_action, हालांकि यह ऐसा करना आसान है, Frontend::BaseControllerजहां यह पूरी सीमा पर लागू होता है। आप response.headers.except! ...किसी क्रिया के भीतर भी चल सकते हैं ।
कोडेनर

2
अभी तक, Chrome में काम नहीं कर रहा है। कंसोल त्रुटि "अमान्य 'एक्स-फ़्रेम-ऑप्शंस' हेडर है जिसका सामना 'बच्चे' को लोड करते समय किया जाता है: 'ALLOW-FROM पैरेंट' एक मान्यता प्राप्त निर्देश नहीं है। हेडर को अनदेखा किया जाएगा।" क्रोमियम में तय नहीं किया जाएगा, एक विकल्प के साथ: "'फ़्रेम-पूर्वजों' क्रोम और फ़ायरफ़ॉक्स दोनों में शिपिंग है, और इस कार्यक्षमता का समर्थन करने का सही तरीका है।" Bugs.chromium.org/p/chromium/issues/detail?id=129139
richardkmiller

5

मैं यहाँ किसी को भी एक अद्यतन उत्तर शामिल करना चाहता था जो इस लिंक को पाता है जब यह पता लगाने की कोशिश की जा रही है कि कैसे आपके रेल एप्लिकेशन को आई-फ्रेम में एम्बेड करने और मुद्दों में चलने की अनुमति दी जाए।

यह लिखने के रूप में, 28 मई 2020, एक्स-फ्रेम-ऑप्शंस परिवर्तन शायद आपकी समस्या का सबसे अच्छा समाधान नहीं हैं। "ALLOW-FROM" विकल्प सभी प्रमुख ब्राउज़रों द्वारा पूरी तरह से बंद कर दिया गया है।

आधुनिक समाधान एक सामग्री-सुरक्षा-नीति को लागू करना और एक 'फ्रेम_सैंस्टर्स' नीति निर्धारित करना है। 'Frame_ancestors' कुंजी बताती है कि डोमेन आपके ऐप को iframe के रूप में एम्बेड कर सकता है। यह वर्तमान में प्रमुख ब्राउज़रों द्वारा समर्थित है और आपके एक्स-फ्रेम-ऑप्शंस को ओवरराइड करता है। यह आपको क्लिकजैकिंग को रोकने की अनुमति देगा (जो कि एक्स-फ्रेम-ऑप्शंस का मूल रूप से मदद करना था, इससे पहले कि यह बड़े पैमाने पर पदावनत हो जाए) और एक आधुनिक वातावरण में अपने ऐप को बंद कर दें।

आप एक आरंभिक (उदाहरण के नीचे) में रेल 5.2 के साथ एक कंटेंट-सिक्योरिटी-पॉलिसी सेट कर सकते हैं, और रेल्स <5.2 के लिए आप सिक्योर हेडर्स मणि जैसे रत्न का उपयोग कर सकते हैं: https://github.com/github/secure_headers

यदि आप चाहें, तो आप एक नियंत्रक / कार्रवाई के आधार पर नीति विनिर्देशों को भी ओवरराइड कर सकते हैं।

सामग्री-सुरक्षा-नीतियां उन्नत सुरक्षा सुरक्षा के लिए महान हैं। उन सभी चीज़ों की जाँच करें जिन्हें आप रेल डॉक्स में कॉन्फ़िगर कर सकते हैं: https://edgeguides.rubyonrails.org/secin.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' }
शार्गोज

0

रेल 5+ के लिए, response.set_header('X-Frame-Options', 'ALLOW-FROM https://apps.facebook.com')इसके बजाय उपयोग करें । या अगर ALLOW-FROMकाम नहीं करता है और आपको जल्दी ठीक करने की आवश्यकता है, तो आप इसे सेट कर सकते हैंALLOWALL

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.