So überschreiben Sie X-Frame-Optionen für einen Controller oder eine Aktion in Rails 4

87

Rails 4 scheint einen Standardwert SAMEORIGINfür den X-Frame-OptionsHTTP-Antwortheader festzulegen. Dies ist aus Sicherheitsgründen sehr hilfreich, ermöglicht jedoch nicht, dass Teile Ihrer App in einer iframeanderen Domain verfügbar sind .

Sie können den Wert von X-Frame-Optionsglobal mit der folgenden config.action_dispatch.default_headersEinstellung überschreiben :

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

Aber wie überschreiben Sie es für nur einen Controller oder eine Aktion?

Chris Peters
quelle

Antworten:

135

Wenn Sie den Header vollständig entfernen möchten, können Sie einen after_actionFilter erstellen :

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

  def embed
  end

private

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

Oder Sie können natürlich das codieren after_action, um den Wert auf etwas anderes zu setzen:

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

Beachten Sie, dass Sie Ihren Cache in bestimmten Browsern (Chrome für mich) leeren müssen, während Sie dies debuggen.

Chris Peters
quelle
Wie würden Sie dies dazu bringen, an einem redirect_to zu arbeiten? (Ich versuche es gerade mit meiner Angular App und es funktioniert nicht)
kittyminky
Ich würde davon ausgehen, dass sowohl die Aktion, die die enthält, redirect_toals auch die Aktion, zu der sie umleitet, angewendet werden müssen. Erhalten Sie einen bestimmten Fehler? Klingt nach einer guten neuen Frage zu Stack Overflow!
Chris Peters
Mir wurde klar, dass ich das hatte, after_action bevor es zur endgültigen Controller-Aktion umgeleitet wurde, die zu den AngularRouten umleitet . Danke dir!
Kittyminky
Dies ist in einem nicht erforderlichafter_action , obwohl dies praktisch ist, z. B. in einem Bereich, Frontend::BaseControllerin dem es für das gesamte Frontend gilt. Sie können auch response.headers.except! ...innerhalb einer Aktion ausgeführt werden.
Codener
2
Funktioniert derzeit nicht in Chrome. Der Konsolenfehler lautet "Beim Laden von 'child' ist ein ungültiger 'X-Frame-Options'-Header aufgetreten:' ALLOW-FROM parent 'ist keine erkannte Anweisung. Der Header wird ignoriert." Als nicht in Chromium reparierbar markiert, mit einer Alternative: "'Frame-Vorfahren' werden sowohl in Chrome als auch in Firefox ausgeliefert und sind der richtige Weg, um diese Funktionalität zu unterstützen." bugs.chromium.org/p/chromium/issues/detail?id=129139
richardkmiller
2

Ich wollte hier nur eine aktualisierte Antwort für alle einfügen, die diesen Link finden, wenn sie herausfinden möchten, wie Ihre Rails-App in einen I-Frame eingebettet werden kann und Probleme auftreten.

Zum Zeitpunkt des Schreibens am 28. Mai 2020 sind die Änderungen der X-Frame-Optionen wahrscheinlich nicht die beste Lösung für Ihr Problem. Die Option "ALLOW-FROM" wurde von allen gängigen Browsern vollständig abgelehnt.

Die moderne Lösung besteht darin, eine Content-Security-Richtlinie zu implementieren und eine 'frame_ancestors'-Richtlinie festzulegen. Der Schlüssel 'frame_ancestors' gibt an, welche Domains Ihre App als Iframe einbetten können. Es wird derzeit von gängigen Browsern unterstützt und überschreibt Ihre X-Frame-Optionen. Auf diese Weise können Sie Clickjacking verhindern (bei dem die X-Frame-Optionen ursprünglich helfen sollten, bevor es weitgehend veraltet war) und Ihre App in einer modernen Umgebung sperren.

Sie können eine Inhaltssicherheitsrichtlinie mit Rails 5.2 in einem Initialisierer einrichten (Beispiel unten), und für Rails <5.2 können Sie einen Edelstein wie den Edelstein "Sichere Header" verwenden: https://github.com/github/secure_headers

Sie können die Richtlinienspezifikationen auch auf Controller- / Aktionsbasis überschreiben, wenn Sie möchten.

Inhaltssicherheitsrichtlinien eignen sich hervorragend für erweiterten Sicherheitsschutz. Überprüfen Sie alle Dinge, die Sie in den Rails-Dokumenten konfigurieren können: https://edgeguides.rubyonrails.org/security.html

Ein Rails 5.2-Beispiel für eine Content-Security-Policy:

# 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

Ein Beispiel für eine Controller-spezifische Änderung einer Richtlinie:

# 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
armont_development
quelle
0

Verwenden Sie response.set_header('X-Frame-Options', 'ALLOW-FROM https://apps.facebook.com')stattdessen für Rails 5+ . Oder wenn ALLOW-FROMes nicht funktioniert und Sie eine schnelle Lösung benötigen, können Sie es auf einstellenALLOWALL

camilo.forero
quelle