Rails4のコントローラーまたはアクションのX-Frame-Optionsをオーバーライドする方法


88

Rails 4SAMEORIGINは、X-Frame-OptionsHTTP応答ヘッダーのデフォルト値をに設定しているようです。これはセキュリティには最適ですが、アプリの一部をiframe別のドメインで利用できるようにすることはできません。

X-Frame-Optionsconfig.action_dispatch.default_headers設定を使用して、の値をグローバルにオーバーライドできます。

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

しかし、単一のコントローラーまたはアクションに対してどのようにオーバーライドしますか?

回答:


136

ヘッダーを完全に削除したい場合は、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)でキャッシュをクリアする必要があることに注意してください。


これをredirect_toでどのように機能させますか?(現在、Angularアプリで試していますが、機能していません)
kittyminky 2014年

を含むredirect_toアクションとリダイレクト先のアクションの両方にこれを適用する必要があると思います。特定のエラーが発生していますか?Stack Overflowに関する新しい質問のようですね!
クリスピーターズ

ルートにリダイレクトする最後のコントローラーアクションにリダイレクトされるafter_action に、私が持っていたことに気づきましたAngular。ありがとうございました!
kittyminky 2014年

でこれを行う必要はありませんが、フロントエンド全体に適用される場合などafter_actionに行うと便利Frontend::BaseControllerです。response.headers.except! ...アクション内で実行することもできます。
codener 2016年

2
現在、Chromeでは機能していません。コンソールエラーは、「 '子'の読み込み中に無効な 'X-Frame-Options'ヘッダーが見つかりました: 'ALLOW-FROM親'は認識されたディレクティブではありません。ヘッダーは無視されます。」です。Chromiumで修正されないものとしてマークされ、代わりに「「フレームの祖先」はChromeとFirefoxの両方で出荷されており、この機能をサポートする正しい方法です。」 bugs.chromium.org/p/chromium/issues/detail?id=129139
richardkmiller

5

RailsアプリをI-Frameに埋め込んで問題が発生するのを許可する方法を見つけようとしたときに、このリンクを見つけた人のために、ここに更新された回答を含めたかっただけです。

これを書いている時点で、2020年5月28日、X-Frame-Optionsの変更は、おそらく問題に対する最善の解決策ではありません。「ALLOW-FROM」オプションは、すべての主要なブラウザで完全に禁止されています。

最新のソリューションは、Content-Security-Policyを実装し、「frame_ancestors」ポリシーを設定することです。'frame_ancestors'キーは、アプリをiframeとして埋め込むことができるドメインを指定します。現在、主要なブラウザでサポートされており、X-Frame-Optionsを上書きします。これにより、クリックジャッキング(X-Frame-Optionsが大幅に非推奨になる前に支援することを目的としていた)を防ぎ、最新の環境でアプリをロックダウンすることができます。

初期化子でRails5.2を使用してContent-Security-Policyを設定でき(以下の例)、Rails <5.2の場合は、Secure Headers gemのようなgemを使用できます:https//github.com/github/secure_headers

必要に応じて、コントローラー/アクションベースでポリシー仕様をオーバーライドすることもできます。

コンテンツ-セキュリティ-ポリシーは、高度なセキュリティ保護に最適です。Railsのドキュメントで構成できるすべてのものを確認してください:https//edgeguides.rubyonrails.org/security.html

Content-Security-PolicyのRails5.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' }
Sharagoz

0

Rails 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.