it-swarm.com.de

Ruby on Rails 4 App funktioniert nicht in iframe

Wie kann ich meine Rails App über iframe in eine andere Website einbinden?

Es funktioniert gut mit RoR 3, aber nicht mit RoR 4:

<iframe src="http://myrailsapp.com/" width="100%" height="50" id="Rails_iframe">error!</iframe>

Ich habe versucht, verify_authenticity_token und protect_from_forgery Optionen in meinem Controller ... scheint etwas anderes zu sein (aber ich bin mir nicht sicher).

upd. Beispiel: http://jsfiddle.net/zP329/

55
Oleg Pasko

Dies hat damit zu tun, dass Rails 4 standardmäßig zusätzliche Sicherheitsprotokolle aktiviert: http://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1 /

Die Einstellung, die iFrames an entfernten Standorten zerstört, ist X-Frame-Optionen. Standardmäßig ist dies SAMEORIGIN, wodurch verhindert wird, dass der Inhalt domänenübergreifend geladen wird:

config.action_dispatch.default_headers = {
    'X-Frame-Options' => 'SAMEORIGIN'
}

Informationen zu den neuen Standardheadern finden Sie hier: http://edgeguides.rubyonrails.org/security.html#default-headers

Damit der iFrame domänenübergreifend funktioniert, können Sie die Standardheader so ändern, dass X-Frame domänenübergreifend zulässig ist.

config.action_dispatch.default_headers = {
    'X-Frame-Options' => 'ALLOWALL'
}
100
jcypret

Rails 4hinzugefügt ein Standardwert für den HTTP-Header X-Frame-Options Von SAMEORIGIN. Dies ist gut für die Sicherheit, aber wenn Sie do möchten, dass Ihr action in einem iframe aufgerufen wird, können Sie dies tun:


So lassen Sie alle Ursprünge zu:

class MyController < ApplicationController
  def iframe_action
    response.headers.delete "X-Frame-Options"
    render_something
  end
end


So erlauben Sie einen bestimmten Ursprung:

class MyController < ApplicationController
  def iframe_action
    response.headers["X-FRAME-OPTIONS"] = "ALLOW-FROM http://some-Origin.com"
    render_something
  end
end


Verwenden Sie: after_filter

Wenn Sie mehrere Ihrer action in einem iframe verwenden müssen, ist es eine gute Idee, eine Methode zu erstellen und mit :after_filter Aufzurufen:

class ApplicationController < ActionController::Base

  private
  def allow_iframe
    response.headers.delete "X-Frame-Options"
  end
end

Verwenden Sie es in Ihren Controllern wie folgt:

class MyController < ApplicationController
  after_filter :allow_iframe, only: [:basic_embed, :awesome_embed]

  def basic_embed
      render_something
  end

  def awesome_embed
      render_something
  end

  # Other Actions...
end

Via: Rails 4: bestimmte Aktionen als iframes einbetten lassen

47
Sheharyar