Comment intégrer du contenu Drupal dans d'autres sites (supprimer X-Frame-Options: SAMEORIGIN)?


11

J'ai essayé de faire un iframe avec une page drupal mais j'ai reçu le message suivant:

Multiple "Refus d'afficher (l'adresse de la page) dans un cadre car il a défini" X-Frame-Options "sur" SAMEORIGIN "."

Ensuite, j'ai essayé de changer l'en-tête de réponse dans le contrôleur de page en utilisant

$response->headers->set('X-Frame-Options', 'GOFORIT');

Et j'ai reçu le message suivant

Plusieurs en-têtes 'X-Frame-Options' avec des valeurs contradictoires ('GOFORIT, SAMEORIGIN') rencontrés lors du chargement de '(adresse de page)'. Revenir à «DENY».

Drupal core met le code suivant dans toutes les réponses.

$response->headers->set('X-Frame-Options', 'SAMEORIGIN', FALSE);

Alors, comment puis-je remplacer l'en-tête X-Frame-Options pour cette réponse uniquement pour intégrer cette page dans d'autres sites?

J'utilise Drupal 8.0.0.

Réponses:


4

L'en- X-Frame-Optionstête semble avoir été ajouté à Drupal 8 afin d'empêcher le cliquetis: https://www.drupal.org/node/2514152

Selon la notification ci-dessus, afin d'intégrer votre site Drupal dans d'autres sites,

un nouvel abonné de réponse doit être ajouté qui a une priorité plus élevée que l'actuel FinishResponseSubscriber (voir core.services.yml) pour écraser ou supprimer l'en-tête - selon le cas d'utilisation

Il fournit également un exemple de code:

<?php
    $path = $request->getPathInfo();

    if (strpos($path, '/fb-app/') === 0) {
      $request->headers->remove('X-Frame-Options');
    }
?>

22

Drupal 8 ajoute l'en-tête de réponse X-Frame-Options: SAMEORIGINà toutes les pages. Cela empêche que le contenu soit inclus dans des iframes sur des sites tiers.

Vous pouvez vérifier par exemple dans la recherche d'images google que votre contenu n'apparaît pas dans le cadre d'aperçu.

Cette fonctionnalité a été introduite dans drupal 8 beta 13.

Le record du changement

Le noyau est désormais protégé contre le cliquetis par défaut (X-Frame-Options: SAMEORIGIN)

n'est pas correct dans la mesure où la priorité doit être plus élevée, en fait, elle doit être inférieure. L'exemple de code modifie la demande mais il doit changer la réponse.

Pour fournir une solution à la question, voici le code complet incluant le fichier yaml pour le mettre dans le conteneur de service:

mymodule/src/EventSubscriber/RemoveXFrameOptionsSubscriber.php:

<?php

namespace Drupal\mymodule\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class RemoveXFrameOptionsSubscriber implements EventSubscriberInterface {

  public function RemoveXFrameOptions(FilterResponseEvent $event) {
    $response = $event->getResponse();
    $response->headers->remove('X-Frame-Options');
  }

  public static function getSubscribedEvents() {
    $events[KernelEvents::RESPONSE][] = array('RemoveXFrameOptions', -10);
    return $events;
  }
}

mymodule/mymodule.services.yml:

services:
  remove_x_frame_options_subscriber:
    class: Drupal\mymodule\EventSubscriber\RemoveXFrameOptionsSubscriber
    tags:
      - { name: event_subscriber }

J'utilise un formateur de champs personnalisé pour inclure les iframes Youtube. Comment supprimer ces options X-Frame pour afficher le lecteur iframe YouTube?
JayKandari

Cette réponse devrait être acceptée maintenant - elle est bien pensée et complète. Merci également pour le code d'accès, très utile.
Storsey

6

4k4 donne une excellente solution, mais peut également être

$ response-> headers-> set ('X-Frame-Options', 'ALLOW-FROM https://ALLOWED.SITE/ ');

mieux que

$ response-> headers-> remove ('X-Frame-Options');


1
Notez que cela allow-from uriest obsolète et ne fonctionnera plus sur les navigateurs modernes. Les 2 seules options que cet en-tête a actuellement sont sameoriginou deny. X-Frame-Options MDN
Beebee

2

Il est très simple de remplacer les en-têtes .htaccessavec une seule instruction

Header set X-FRAME-OPTIONS "ALLOWALL"

Alternativement, vous pouvez le faire appliquer uniquement à certaines conditions en utilisant des expressions if instruction apache

<If "%{QUERY_STRING} =~ /embed/">
    Header set X-FRAME-OPTIONS "ALLOWALL"
</If>

puis vous pouvez appeler votre URL en ajoutant embeddans votre chaîne de requête

https://domain.com/yoururl?param1=true&embed

Pour que cela fonctionne, vous aurez besoin d' apache 2.4 ou supérieur et du module d'en- têtes activé. Sinon, vous pouvez peut-être les activer avec

sudo a2enmod headers
sudo service apache2 restart

1

Il y a maintenant un module téléchargeable pour Drupal 8: Configuration des options X-Frame

Ce module peut être utilisé pour définir l'en-tête x-frame-options sur votre site Web avec la directive appropriée. Cela peut être utile lorsque vous souhaitez inclure l'une des pages de votre site dans une iframe dans un autre site.

Les directives doivent être:

  1. NIER
  2. SAMEORIGINE
  3. ALLOW-FROM uri (actuellement [2018-10-25] non accepté par Chrome ni Safari). Vous serez autorisé à configurer quel uri.

0

Pour les navigateurs plus récents, les ALLOW-FROM uriparamètres ne fonctionneraient plus, voir la section "allow-from uri (obsolete)" dans la section https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame- Les options

Vous devez ajouter

$response->headers->set('Content-Security-Policy', 'frame-ancestors https://ALLOWED.SITE/'); en plus de ce que wakh.ru proposait:

$response->headers->set('X-Frame-Options', 'ALLOW-FROM https://ALLOWED.SITE/');

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.