Comment définir 'X-Frame-Options' sur iframe?

170

Si je crée un iframecomme celui-ci:

var dialog = $('<div id="' + dialogId + '" align="center"><iframe id="' + frameId + '" src="' + url + '" width="100%" frameborder="0" height="'+frameHeightForIe8+'" data-ssotoken="' + token + '"></iframe></div>').dialog({

Comment puis-je corriger l'erreur:

Refusé d'afficher 'https://www.google.com.ua/?gws_rd=ssl'dans un cadre car il a défini «X-Frame-Options» sur «SAMEORIGIN».

avec JavaScript?

Darien Fawkes
la source

Réponses:

227

Vous ne pouvez pas définir X-Frame-Optionsle iframe. Il s'agit d'un en-tête de réponse défini par le domaine à partir duquel vous demandez la ressource ( google.com.uadans votre exemple). SAMEORIGINDans ce cas, ils ont défini l'en-tête sur, ce qui signifie qu'ils ont interdit le chargement de la ressource à l' iframeextérieur de leur domaine. Pour plus d'informations, consultez l'en -tête de réponse X-Frame-Options sur MDN.

Une inspection rapide des en-têtes (affichés ici dans les outils de développement Chrome) révèle la X-Frame-Optionsvaleur renvoyée par l'hôte.

entrez la description de l'image ici

Drew Gaynor
la source
7
Avec YouTube, vous pouvez modifier l'URL du point de terminaison en version "incorporée". Voir stackoverflow.com/questions/25661182/ ... (Je sais que ce n'est pas strictement ce que l'OP recherche, mais Google donne ce résultat en premier!)
73

X-Frame-Optionsest un en-tête inclus dans la réponse à la demande pour indiquer si le domaine demandé se permettra de s'afficher dans une trame. Cela n'a rien à voir avec javascript ou HTML et ne peut pas être modifié par l'expéditeur de la requête.

Ce site Web a défini cet en-tête pour qu'il ne soit pas affiché dans un fichier iframe. Un client ne peut rien faire pour arrêter ce comportement.

Lectures complémentaires sur les options X-Frame

Rory McCrossan
la source
Il est défini dans l'en-tête de la réponse, pas dans l'en-tête de la demande. Mais sinon une explication précise!
nickang
2
@nickang c'est ce que je voulais dire, mais je suis d'accord que la terminologie n'était pas claire. Je l'ai modifié pour supprimer toute confusion. Merci.
Rory McCrossan
31

Si vous contrôlez le serveur qui envoie le contenu de l'iframe, vous pouvez définir le paramètre X-Frame-Optionssur votre serveur Web.

Configurer Apache

Pour envoyer l'en-tête X-Frame-Options pour toutes les pages, ajoutez ceci à la configuration de votre site:

Header always append X-Frame-Options SAMEORIGIN

Configurer nginx

Pour configurer nginx pour envoyer l'en-tête X-Frame-Options, ajoutez ceci à votre configuration http, serveur ou emplacement:

add_header X-Frame-Options SAMEORIGIN;

Aucune configuration

Cette option d'en-tête est facultative, donc si l'option n'est pas du tout définie, vous aurez la possibilité de la configurer à l'instance suivante (par exemple le navigateur des visiteurs ou un proxy)

source: https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options

rubo77
la source
Cela m'a aidé. Je commente ces deux lignes: à add_header Strict-Transport-Security "max-age=86400; includeSubdomains"; add_header X-Frame-Options DENY;partir des nginx-snippets, puis cela a fonctionné tout de suite.
Zeth
NGINX, important de dire où , à l'intérieur de l'emplacement?
Peter Krauss
Peter Kraus, que voulez-vous?
rubo77
14

Puisque la solution n'a pas vraiment été mentionnée pour le côté serveur:

Il faut définir des choses comme celle-ci (exemple d'Apache), ce n'est pas la meilleure option car elle le permet dans tout, mais après avoir vu votre serveur fonctionner correctement, vous pouvez facilement modifier les paramètres.

           Header set Access-Control-Allow-Origin "*"
           Header set X-Frame-Options "allow-from *"
Mike Q
la source
5

pas vraiment ... j'ai utilisé

 <system.webServer>
     <httpProtocol allowKeepAlive="true" >
       <customHeaders>
         <add name="X-Frame-Options" value="*" />
       </customHeaders>
     </httpProtocol>
 </system.webServer>
LongChalk
la source
Cela ressemble à une solution, mais s'agit-il d'une faille de sécurité?
Yogurtu
1
Ce n'est pas une bonne idée de désactiver la même politique d'origine pour votre site à moins que vous ne sachiez exactement ce que vous faites. Vous ne devez pas autoriser des domaines différents du vôtre à intégrer du contenu. Voir codecademy.com/articles/what-is-cors et des didacticiels similaires.
slhck
5

et si rien ne vous aide et que vous souhaitez toujours présenter ce site Web dans un iframe, envisagez d'utiliser le composant X Frame Bypass qui utilisera un proxy.

Tomer Ben David
la source
2

L'en-tête de réponse HTTP X-Frame-Options peut être utilisé pour indiquer si un navigateur doit être autorisé à afficher une page dans un fichier <frame>, <iframe>ou <object>. Les sites peuvent l'utiliser pour éviter les attaques de détournement de clic, en s'assurant que leur contenu n'est pas intégré à d'autres sites.

Pour plus d'informations: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

J'ai une solution alternative à ce problème, que je vais démontrer en utilisant PHP:

iframe.php:

<iframe src="target_url.php" width="925" height="2400" frameborder="0" ></iframe>

target_url.php:

<?php 
  echo file_get_contents("http://www.example.com");
?>
Shailesh Dwivedi
la source
5
Est-ce une solution viable pour utiliser la page après son chargement? Pourrai-je interagir avec les pages après le chargement initial? Est-ce que toutes les demandes pour le domaine ne doivent pas être envoyées par proxy afin d'utiliser le contenu après son chargement?
Timothy Gonzalez
0

Pour cela, vous devez faire correspondre l'emplacement dans votre apache ou dans tout autre service que vous utilisez

Si vous utilisez apache, dans le fichier httpd.conf.

  <LocationMatch "/your_relative_path">
      ProxyPass absolute_path_of_your_application/your_relative_path
      ProxyPassReverse absolute_path_of_your_application/your_relative_path
   </LocationMatch>
Ibtesam Latif
la source
0

La solution est d'installer un plugin de navigateur.

Un site Web qui émet un en-tête HTTP X-Frame-Optionsavec une valeur de DENY(ou SAMEORIGINavec une origine de serveur différente) ne peut pas être intégré dans un IFRAME ... sauf si vous modifiez ce comportement en installant un plugin de navigateur qui ignore l'en- X-Frame-Optionstête (par exemple , Ignore X-Frame Headers de Chrome ).

Notez que cela n'est pas du tout recommandé pour des raisons de sécurité.

Julien Kronegg
la source
0

vous pouvez définir l'option x-frame dans la configuration Web du site que vous souhaitez charger dans iframe comme ceci

<httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="*" />
    </customHeaders>
  </httpProtocol>
Nikki
la source
si je veux ouvrir stackoverflow, où puis-je trouver la configuration Web? n'est-ce pas pour le serveur?
irum zahra
-1

Vous ne pouvez pas vraiment ajouter le x-iframe dans votre corps HTML car il doit être fourni par le propriétaire du site et il se trouve dans les règles du serveur.

Ce que vous pouvez probablement faire est de créer un fichier PHP qui charge le contenu de l'URL cible et iframe cette URL php, cela devrait fonctionner correctement.

Sushant Chaudhari
la source
1
"Vous pouvez probablement" puis le poster en commentaire si ce n'est pas une réponse
MK
Et si cela s'avère être une réponse MK
Sushant Chaudhari
Ensuite, c'est une suggestion qui a fonctionné, pas une solution spécifique, elle devrait donc être placée en commentaire
MK
-2

vous pouvez le faire dans le fichier de configuration au niveau de l'instance tomcat (web.xml). Vous devez ajouter le 'filtre' et le mappage de filtre 'dans le fichier de configuration web.xml. cela ajoutera les [X-frame-options = DENY] dans toute la page car il s'agit d'un paramètre global.

<filter>
        <filter-name>httpHeaderSecurity</filter-name>
        <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
          <param-name>antiClickJackingEnabled</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
          <param-name>antiClickJackingOption</param-name>
          <param-value>DENY</param-value>
        </init-param>
    </filter>

  <filter-mapping> 
    <filter-name>httpHeaderSecurity</filter-name> 
    <url-pattern>/*</url-pattern>
</filter-mapping>
Rejji
la source
-3

Si vous suivez l'approche xml, le code ci-dessous fonctionnera.

    <security:headers>
        <security:frame-options />
        <security:cache-control />
        <security:content-type-options />
        <security:xss-protection />
    </security:headers>
<security:http>
Bikash Pandit
la source