¿Cómo incrustar contenido de drupal en otros sitios (eliminar X-Frame-Options: SAMEORIGIN)?

11

Traté de hacer un iframe con una página de drupal pero recibí el siguiente mensaje:

Múltiple "Se negó a mostrar (dirección de página) en un marco porque configuró 'X-Frame-Options' a 'SAMEORIGIN'."

Luego, intenté cambiar el encabezado de respuesta en el controlador de página usando

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

Y recibí el siguiente mensaje

Múltiples encabezados 'X-Frame-Options' con valores en conflicto ('GOFORIT, SAMEORIGIN') encontrados al cargar '(dirección de página)'. Volviendo a 'DENY'.

Drupal core pone el siguiente código en todas las respuestas.

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

Entonces, ¿cómo puedo anular el encabezado X-Frame-Options solo para esta respuesta para incrustar esta página en otros sitios?

Estoy usando Drupal 8.0.0.

Victor Pereira
fuente

Respuestas:

4

El X-Frame-Optionsencabezado parece haberse agregado a Drupal 8 para evitar clics: https://www.drupal.org/node/2514152

Según la notificación anterior, para insertar su sitio de Drupal en otros sitios,

se debe agregar un nuevo Suscriptor de respuesta que tenga una prioridad más alta como el FinishResponseSubscriber actual (consulte core.services.yml) para sobrescribir o eliminar el encabezado, según el caso de uso

También proporciona un ejemplo de código:

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

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

Drupal 8 agrega el encabezado de respuesta X-Frame-Options: SAMEORIGINa todas las páginas. Esto evita que el contenido se incluya en iframes en sitios de terceros.

Puede verificar esto, por ejemplo, en la búsqueda de imágenes de Google para que su contenido no aparezca en el marco de vista previa.

Esta característica se introdujo en drupal 8 beta 13.

El registro de cambio

Core está ahora protegido contra clics de forma predeterminada (X-Frame-Options: SAMEORIGIN)

no es correcto porque la prioridad tiene que ser mayor, de hecho tiene que ser menor. El ejemplo de código cambia la solicitud pero tiene que cambiar la respuesta.

Para proporcionar una solución a la pregunta aquí está el código completo que incluye el archivo yaml para poner esto en el contenedor del servicio:

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
fuente
Estoy usando un formateador de campo personalizado para incluir iframes de Youtube. ¿Cómo elimino estas opciones de X-Frame para mostrar el reproductor de iframe de YouTube?
JayKandari
Esta respuesta debería aceptarse ahora: está bien pensada y completa. También gracias por el código directo, muy útil.
Storsey
6

4k4 dan una gran solución, pero también puede ser

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

Mejor entonces

$ respuesta-> encabezados-> eliminar ('X-Frame-Options');

wakh.ru
fuente
1
Tenga en cuenta que allow-from uriestá en desuso y ya no funcionará en los navegadores modernos. Las únicas 2 opciones que tiene este encabezado en este momento son sameorigino deny. X-Frame-Options MDN
Beebee
2

Es muy simple anular los encabezados .htaccesscon una sola declaración

Header set X-FRAME-OPTIONS "ALLOWALL"

Alternativamente , puede hacer que solo se aplique en ciertas condiciones usando expresiones de apache de instrucciones

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

y luego puede llamar a su URL agregando embeden su cadena de consulta

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

Para que esto funcione, necesitará apache 2.4 o superior y el módulo de encabezados habilitado. Si no está habilitado, quizás pueda habilitarlos con

sudo a2enmod headers
sudo service apache2 restart
GiorgosK
fuente
1

Ahora hay un módulo descargable para Drupal 8: Configuración de opciones de X-Frame

Este módulo se puede usar para establecer el encabezado x-frame-options en su sitio web con la directiva correspondiente. Esto puede ser útil cuando desee incluir una de las páginas de su sitio dentro de un iframe en otro sitio.

Las directivas deben ser:

  1. NEGAR
  2. SAMEORIGIN
  3. ALLOW-FROM uri (Actualmente [2018-10-25] no aceptado por Chrome ni Safari). Se le permitirá configurar qué uri.
artem
fuente
0

Para los navegadores más nuevos, la ALLOW-FROM uriconfiguración ya no funcionaría, consulte la sección "allow-from uri (obsoleto)" en https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame- Opciones

Necesitas agregar

$response->headers->set('Content-Security-Policy', 'frame-ancestors https://ALLOWED.SITE/'); Además de lo que propuso wakh.ru:

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

drupov
fuente