Wie kann ich Drupal-Inhalte in andere Websites einbetten (X-Frame-Optionen entfernen: SAMEORIGIN)?

11

Ich habe versucht, einen Iframe mit einer Drupal-Seite zu erstellen, aber ich habe die folgende Nachricht erhalten:

Multiple "Die Anzeige (Seitenadresse) in einem Frame wurde abgelehnt, da" X-Frame-Optionen "auf" SAMEORIGIN "gesetzt wurde."

Dann habe ich versucht, den Header der Antwort in Page Controller mit zu ändern

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

Und ich habe die folgende Nachricht erhalten

Beim Laden von '(Seitenadresse)' sind mehrere 'X-Frame-Options'-Header mit widersprüchlichen Werten (' GOFORIT, SAMEORIGIN ') aufgetreten. Zurückgreifen auf "VERWEIGERN".

Drupal Core fügt den folgenden Code in alle Antworten ein.

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

Wie kann ich den X-Frame-Options-Header überschreiben, damit nur diese Antwort diese Seite in andere Websites einbettet?

Ich benutze Drupal 8.0.0.

Victor Pereira
quelle

Antworten:

4

Der X-Frame-OptionsHeader wurde anscheinend zu Drupal 8 hinzugefügt, um ein Click-Jacking zu verhindern: https://www.drupal.org/node/2514152

Um Ihre Drupal-Site in andere Sites einzubetten, müssen Sie gemäß der obigen Benachrichtigung

Es muss ein neuer Antwortabonnent hinzugefügt werden, der eine höhere Priorität als der aktuelle FinishResponseSubscriber (siehe core.services.yml) hat, um den Header zu überschreiben oder zu entfernen - je nach Anwendungsfall

Es enthält auch ein Codebeispiel:

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

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

Drupal 8 fügt X-Frame-Options: SAMEORIGINallen Seiten den Antwortheader hinzu . Dies verhindert, dass der Inhalt in Iframes auf Websites von Drittanbietern enthalten ist.

Sie können dies beispielsweise bei der Google-Bildsuche überprüfen, ob Ihr Inhalt nicht im Vorschaurahmen angezeigt wird.

Diese Funktion wurde in Drupal 8 Beta 13 eingeführt.

Der Änderungsdatensatz

Core ist jetzt standardmäßig gegen Click-Jacking geschützt (X-Frame-Optionen: SAMEORIGIN)

ist insofern nicht korrekt, als die Priorität höher sein muss, tatsächlich muss sie niedriger sein. Das Codebeispiel ändert die Anforderung, muss jedoch die Antwort ändern.

Um eine Lösung für die Frage zu finden, finden Sie hier den vollständigen Code einschließlich der yaml-Datei, um diese in den Service-Container zu legen:

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 }
4k4
quelle
Ich verwende einen benutzerdefinierten Feldformatierer, um Youtube-Iframes einzuschließen. Wie entferne ich diese X-Frame-Optionen zum Anzeigen des YouTube-Iframe-Players?
JayKandari
Diese Antwort sollte jetzt akzeptiert werden - sie ist gut durchdacht und vollständig. Vielen Dank auch für den Drop-In-Code, sehr hilfreich.
Storsey
6

4k4 geben tolle Lösung, können aber auch sein

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

besser als

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

wakh.ru
quelle
1
Beachten Sie, dass dies allow-from uriveraltet ist und in modernen Browsern nicht mehr funktioniert. Die einzigen 2 Optionen, die dieser Header derzeit hat, sind sameoriginoder deny. X-Frame-Optionen MDN
Beebee
2

Es ist sehr einfach, die Header .htaccessmit einer einzigen Anweisung zu überschreiben

Header set X-FRAME-OPTIONS "ALLOWALL"

Alternativ können Sie festlegen, dass es nur unter bestimmten Bedingungen angewendet wird, indem Sie Apache-Ausdrücke für if-Anweisungen verwenden

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

und dann können Sie Ihre vollständigen URL aufrufen embedin der Abfrage - String

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

Damit dies funktioniert, benötigen Sie Apache 2.4 oder höher und das Header- Modul ist aktiviert. Wenn nicht aktiviert, können Sie sie möglicherweise mit aktivieren

sudo a2enmod headers
sudo service apache2 restart
GiorgosK
quelle
1

Es gibt jetzt ein herunterladbares Modul für Drupal 8: X-Frame-Options Configuration

Mit diesem Modul können Sie den Header für x-frame-options auf Ihrer Website mit der entsprechenden Anweisung festlegen. Dies kann nützlich sein, wenn Sie eine der Seiten Ihrer Site in einen Iframe einer anderen Site aufnehmen möchten.

Die Richtlinien müssen sein:

  1. VERWEIGERN
  2. SAMEORIGIN
  3. ALLOW-FROM uri (Derzeit [2018-10-25] weder von Chrome noch von Safari akzeptiert). Sie können konfigurieren, welche URL.
artem
quelle
0

Für neuere Browser ALLOW-FROM urifunktionieren die Einstellungen nicht mehr, siehe Abschnitt "Zulassen von uri (veraltet)" - Abschnitt in https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame- Optionen

Sie müssen hinzufügen

$response->headers->set('Content-Security-Policy', 'frame-ancestors https://ALLOWED.SITE/'); zusätzlich zu dem, was wakh.ru vorgeschlagen hat:

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

drupov
quelle