web-dev-qa-db-fra.com

Impossible d'afficher mon application Rails 4 dans l'iframe, même si 'X-Frame-Options' est 'ALLOWALL'

J'essaie de tester un design réactif. J'utilise Rails 4. Je sais qu'il définit l'option 'X-Frame-Options' sur SAME Origin. Donc je l'ai annulé dans development.rb en utilisant

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

et cela a fonctionné. J'ai vérifié la demande de réseau dans la console Chrome et elle se présente comme suit:

enter image description here

Mais toujours des sites comme responsive.is et responsinator.com me donnent l'erreur ci-dessous:

Refused to display 'http://localhost:3000/' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'. about:blank:1

Que se passe-t-il??

42
Steve Robinson

J'ai eu le même problème que vous et j'ai cherché une solution à ce problème toute la nuit.

J'ai finalement découvert pourquoi cela se produit. C'est à cause du cache Chrome.

Vous pouvez voir que header['X-Frame-Options'] est ALLOWALL mais cela ne fonctionne pas.

Essayez simplement d’ouvrir une "Nouvelle fenêtre Incognito" et d’aller sur la même page et ça marche!

Ce problème ne s'est produit qu'en mode développement dans mon test. Cela a bien fonctionné en mode production.

27
Yi Feng Xie

Essayez juste de supprimer cet en-tête 'X-Frame-Options' . Peut-être de cette façon dans le contrôleur:

before_filter :allow_iframe_requests
...
def allow_iframe_requests
  response.headers.delete('X-Frame-Options')
end
65
Timrael

Rails 4ajouté _ une valeur par défaut de X-Frame-Options HTTP HTTP de SAMEORIGIN. C'est bon pour la sécurité, mais lorsque vous voulez que votre action soit appelée dans un iframe, vous pouvez le faire: 


Pour autoriser toutes les origines:

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

Pour autoriser une origine spécifique:

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

Utilisez: after_filter

Lorsque vous devez utiliser plus d'une de vos action dans une iframe, c'est une bonne idée de créer une méthode et de l'appeler avec :after_filter:

class ApplicationController < ActionController::Base

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

Utilisez-le dans vos contrôleurs comme ceci:

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

Effectuez une actualisation complète dans votre navigateur ou utilisez un autre navigateur pour afficher les modifications.

Via: Rails 4: permet à des actions spécifiques d'être incorporées comme des iframes

22
Sheharyar

Lorsque 'Refuser le chargement par X-Frame-Options' avec Heroku et Firefox

J'ai eu un problème similaire où je continuais à avoir cette erreur seulement sur Firefox. J'avais une page Web PHP hébergée @ MochaHost servant une application Rails hébergée @ Heroku (donc l'application RoR a une page avec une iframe qui pointe vers la page Web PHP et qui fonctionne actuellement. tous les navigateurs sauf sur Firefox).

J'ai pu résoudre le problème en définissant un en-tête par défaut pour toutes mes demandes dans le fichier d'environnement spécifique:

# config/enviroments/production.rb

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

Edit (Comme sheharyar suggéré)

Dans l'idéal, vous ne devriez pas définir d'en-tête par défaut et ne le faire que pour les actions devant être rendues dans un iFrame. Si l'intégralité de votre application est utilisée dans un iFrame, vous devez explicitement mentionner le Origin:

# config/enviroments/production.rb

config.action_dispatch.default_headers = { 'X-Frame-Options' => 'ALLOW-FROM http://some-Origin.com' }
9
d1jhoni1b

Essayez ALLOW-FROM http://example.com à la place? ALLOWALL pourrait bien fonctionner dans Chrome si vous avez une version suffisamment nouvelle de Chrome [2].

[1] https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options

[2] https://stackoverflow.com/a/16101968/800526

1
Thong Kuah

J'ai trouvé une autre cause à cela. En supposant que le correctif ALLOWALL ou un correctif similaire soit mis en œuvre, le prochain Gotcha tente d'utiliser le contenu http d'un site Web https, ce qui pose des risques pour la sécurité et est bloqué par Mozilla, IE et probablement d'autres navigateurs. Cela m'a pris 6 heures pour identifier cela, j'espère qu'en partageant je peux réduire la douleur de quelqu'un ...

Il peut être vérifié par:

  • en utilisant les outils web de votre navigateur qui devraient afficher une erreur. 
  • les journaux Web n’auront aucune connexion avec votre site fournisseur. 
  • remplacez votre URL de contenu par la page d'accueil d'une banque https devrait montrer que l'iframe fonctionne normalement.

La solution consiste à demander à la source si elle dispose d'un contenu https ou si elle trouve un autre fournisseur.

ref:

0
Matt Stevens

Si vous souhaitez que cette modification prenne effet dans tous les environnements, placez-la dans application.rb.

0
calasyr