Como incorporar conteúdo drupal em outros sites (remover X-Frame-Options: SAMEORIGIN)?

11

Tentei criar um iframe com uma página drupal, mas recebi a seguinte mensagem:

Múltiplo "Recusou-se a exibir (endereço da página) em um quadro porque definiu 'X-Frame-Options' como 'SAMEORIGIN'."

Em seguida, tentei alterar o cabeçalho da resposta no controlador de página usando

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

E recebi a seguinte mensagem

Vários cabeçalhos 'X-Frame-Options' com valores conflitantes ('GOFORIT, SAMEORIGIN') encontrados ao carregar '(endereço da página)'. Voltando ao 'DENY'.

O núcleo do Drupal coloca o seguinte código em todas as respostas.

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

Então, como posso substituir o cabeçalho X-Frame-Options para que apenas essa resposta incorpore esta página em outros sites?

Estou usando o Drupal 8.0.0.

Victor Pereira
fonte

Respostas:

4

O X-Frame-Optionscabeçalho parece ter sido adicionado ao Drupal 8, a fim de evitar cliques: https://www.drupal.org/node/2514152

De acordo com a notificação acima, para incorporar seu site Drupal em outros sites,

é necessário adicionar um novo Assinante de resposta que tenha uma prioridade mais alta como o atual FinishResponseSubscriber (consulte core.services.yml) para substituir ou remover o cabeçalho - dependendo do caso de uso

Ele também fornece um exemplo de código:

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

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

O Drupal 8 adiciona o cabeçalho de resposta X-Frame-Options: SAMEORIGINa todas as páginas. Isso impede que o conteúdo seja incluído em iframes em sites de terceiros.

Você pode verificar isso, por exemplo, na pesquisa de imagens do google, para que seu conteúdo não apareça no quadro de visualização.

Esse recurso foi introduzido no drupal 8 beta 13.

O registro de alterações

O Core agora está protegido contra click-jacking por padrão (X-Frame-Options: SAMEORIGIN)

não é correto, pois a prioridade deve ser maior, na verdade, deve ser menor. O exemplo de código altera a solicitação, mas precisa alterar a resposta.

Para fornecer uma solução para a pergunta aqui, está o código completo, incluindo o arquivo yaml, para colocá-lo no contêiner de serviço:

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
fonte
Estou usando um formatador de campo personalizado para incluir iframes do YouTube. Como removo essas X-Frame-Options para exibir o YouTube iframe Player?
JayKandari
Esta resposta deve ser aceita agora - é bem pensada e completa. Também obrigado pelo código drop-in, muito útil.
Storsey
6

4k4 fornece uma ótima solução, mas também pode ser

$ response-> headers-> set ('Opções de quadros X', 'ALLOW-FROM https://ALLOWED.SITE/ ');

melhor então

$ response-> headers-> remove ('Opções do quadro X');

wakh.ru
fonte
11
Observe que allow-from uriestá obsoleto e não funcionará mais em navegadores modernos. As únicas 2 opções que esse cabeçalho tem no momento são sameoriginou deny. Opções X-Frame MDN
Beebee
2

É muito simples substituir os cabeçalhos por .htaccessuma única declaração

Header set X-FRAME-OPTIONS "ALLOWALL"

Como alternativa, você pode aplicá-lo apenas em determinadas condições usando expressões apache da instrução if

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

e então você pode chamar seu URL adicionando embedna sua string de consulta

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

Para que isso funcione, você precisará do apache 2.4 ou superior e do módulo headers habilitado. Se não estiver ativado, talvez você possa habilitá-los com

sudo a2enmod headers
sudo service apache2 restart
GiorgosK
fonte
1

Agora existe um módulo para download do Drupal 8: Configuração de opções de quadro X

Este módulo pode ser usado para definir o cabeçalho x-frame-options no seu site com a diretiva apropriada. Isso pode ser útil quando você deseja incluir uma das páginas do seu site dentro de um iframe em outro site.

As diretrizes devem ser:

  1. NEGAR
  2. SAMEORIGIN
  3. PERMITIR uri (atualmente [25/10/2018] não aceito pelo chrome nem pelo Safari). Você poderá configurar qual uri.
artem
fonte
0

Para navegadores mais novos, as ALLOW-FROM uriconfigurações não funcionariam mais, consulte a seção "allow-from uri (obsolete)" na https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame- Opções

Você precisa adicionar

$response->headers->set('Content-Security-Policy', 'frame-ancestors https://ALLOWED.SITE/'); além do que o wakh.ru propôs:

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

drupov
fonte