Rails 4'te bir denetleyici veya eylem için X-Frame-Options'ı geçersiz kılma


89

Rails 4 SAMEORIGIN, X-Frame-OptionsHTTP yanıt başlığı için varsayılan bir değer ayarlıyor gibi görünüyor . Bu güvenlik açısından harikadır , ancak uygulamanızın bazı bölümlerinin iframefarklı bir alanda kullanılmasına izin vermez .

Ayarı X-Frame-Optionskullanarak global olarak değerini geçersiz kılabilirsiniz config.action_dispatch.default_headers:

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

Ancak tek bir denetleyici veya eylem için onu nasıl geçersiz kılarsınız?

Yanıtlar:


137

Başlığı tamamen kaldırmak istiyorsanız, bir after_actionfiltre oluşturabilirsiniz :

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

  def embed
  end

private

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

Veya elbette, after_actiondeğeri farklı bir şeye ayarlamak için kodlayabilirsiniz :

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

Bunun hatalarını ayıklarken belirli tarayıcılarda (benim için Chrome) önbelleğinizi temizlemeniz gerektiğini unutmayın.


Bunun bir redirect_to üzerinde çalışmasını nasıl sağlarsınız? (Şu anda Angular uygulamamla deniyorum ve çalışmıyor)
kittyminky

Hem içeren eylemin hem de redirect_toyönlendirdiği eylemin bunun uygulanmasını gerektireceğini varsayıyorum . Belirli bir hata mı alıyorsunuz? Stack Overflow'da yeni ve güzel bir soru gibi görünüyor!
Chris Peters

Rotalara yeniden yönlendiren son denetleyici eylemine yönlendirilmeden after_action önce sahip olduğumu fark ettim Angular. Teşekkür ederim!
kittyminky

O değil gerekli bir bunu yapmanın after_actionbunu yapmak kullanışlı olsa da, yani örneğin bir Frontend::BaseControllero bütün önyüz aracılarına uygulanır. response.headers.except! ...Bir eylem içinde de koşabilirsiniz .
kodlayıcı

2
Şu an itibariyle Chrome'da çalışmıyor. Konsol hatası "Alt öğe 'yüklenirken karşılaşılan geçersiz' X-Frame-Options 'başlığıdır:' ALLOW-FROM parent 'tanınan bir yönerge değil. Başlık yok sayılacak." Chromium'da düzeltilemeyecek şeklinde işaretlenen bir alternatifle: "'çerçeve-atalar' hem Chrome hem de Firefox'ta gönderiliyor ve bu işlevi desteklemenin doğru yolu." bugs.chromium.org/p/chromium/issues/detail?id=129139
richardkmiller

8

Rails uygulamanızın bir I-Frame'e yerleştirilmesine ve sorunlarla karşılaşılmasına nasıl izin verileceğini anlamaya çalışırken bu bağlantıyı bulan herkes için buraya güncellenmiş bir cevap eklemek istedim.

Bunu yazarken, 28 Mayıs 2020, X-Frame-Options değişiklikleri muhtemelen sorununuz için en iyi çözüm değil. "İZİN VER" seçeneği tüm büyük tarayıcılar tarafından tamamen yasaklanmıştır.

Modern çözüm, bir İçerik Güvenliği Politikası uygulamak ve bir 'frame_ancestors' politikası belirlemektir. "Frame_ancestors" anahtarı, uygulamanızı bir iframe olarak hangi alanların yerleştirebileceğini belirler. Şu anda büyük tarayıcılar tarafından desteklenmektedir ve X-Frame-Seçeneklerinizi geçersiz kılar. Bu, Clickjacking'i (X-Frame-Options'ın büyük ölçüde kullanımdan kaldırılmadan önce yardımcı olması amaçlanmıştır) önlemenize ve uygulamanızı modern bir ortamda kilitlemenize olanak tanır.

Bir başlatıcıda Rails 5.2 ile bir İçerik Güvenliği Politikası oluşturabilirsiniz (aşağıdaki örnek) ve Rails <5.2 için Güvenli Başlıklar mücevher gibi bir mücevher kullanabilirsiniz: https://github.com/github/secure_headers

Ayrıca isterseniz bir denetleyici / eylem temelinde politika spesifikasyonlarını geçersiz kılabilirsiniz.

İçerik Güvenliği Politikaları, gelişmiş güvenlik korumaları için mükemmeldir. Rails belgelerinde yapılandırabileceğiniz her şeye göz atın: https://edgeguides.rubyonrails.org/security.html

İçerik Güvenliği Politikası için bir Rails 5.2 örneği:

# 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

Bir politikada denetleyiciye özgü değişikliğe bir örnek:

# 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

Dinamik değerler için bir lambda da kullanabilir:p.frame_ancestors :self, -> { company&.allowed_domain || 'none' }
Sharagoz

Ben kullanıyorum frame_ancestorsve Safari dışında her tarayıcıda çalışıyor. Herhangi bir fikir?
Matt

@Matt - Safari'nin şu anda üçüncü taraf iframe'lerin tanımlama bilgilerini depolamasını engellediğini düşünüyorum - bu, Safari'de iframe kullanımının önemli bir sınırlamasıdır ve sorunun nedeni olabilir. Bildiğim kadarıyla iyi bir çözüm yok. Daha fazla bilgi için bu yığın taşmasını kontrol edin: stackoverflow.com/questions/59723056/…
armont_development

0

Rails 5+ için kullanın response.set_header('X-Frame-Options', 'ALLOW-FROM https://apps.facebook.com') bunun yerine kullanın. Veya ALLOW-FROMişe yaramazsa ve hızlı bir düzeltmeye ihtiyacınız varsa, bunu şu şekilde ayarlayabilirsiniz:ALLOWALL

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.