Come incorporare contenuto di drupal in altri siti (rimuovere X-Frame-Options: SAMEORIGIN)?


11

Ho provato a creare un iframe con una pagina drupal ma ho ricevuto il seguente messaggio:

Multiple "Rifiutato di visualizzare (indirizzo di pagina) in un frame perché imposta" Opzioni X frame "su" SAMEORIGIN "."

Quindi, ho provato a modificare l'intestazione della risposta nel controller di pagina utilizzando

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

E ho ricevuto il seguente messaggio

Più intestazioni "X-Frame-Options" con valori in conflitto ("GOFORIT, SAMEORIGIN") rilevate durante il caricamento di "(indirizzo pagina)". Tornando a "DENY".

Drupal core inserisce il seguente codice in tutte le risposte.

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

Quindi, come posso ignorare l'intestazione X-Frame-Options solo per questa risposta per incorporare questa pagina in altri siti?

Sto usando Drupal 8.0.0.

Risposte:


4

L' X-Frame-Optionsintestazione sembra essere stata aggiunta a Drupal 8 per prevenire il click-jacking: https://www.drupal.org/node/2514152

Secondo la notifica di cui sopra, al fine di incorporare il tuo sito Drupal in altri siti,

è necessario aggiungere un nuovo abbonato Response che abbia una priorità più alta rispetto all'attuale FinishResponseSubscriber (vedi core.services.yml) per sovrascrivere o rimuovere l'intestazione, a seconda del caso d'uso

Fornisce anche un esempio di codice:

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

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

22

Drupal 8 aggiunge l'intestazione della risposta X-Frame-Options: SAMEORIGINa tutte le pagine. Ciò impedisce che il contenuto sia incluso negli iframe su siti di terze parti.

Puoi verificarlo, ad esempio, nella ricerca immagini di Google che i tuoi contenuti non vengano visualizzati nel riquadro di anteprima.

Questa funzione è stata introdotta in drupal 8 beta 13.

Il record di modifica

Il core è ora protetto dal click-jacking di default (X-Frame-Options: SAMEORIGIN)

non è corretto in quanto la priorità deve essere più alta, in effetti deve essere più bassa. L'esempio di codice modifica la richiesta ma deve modificare la risposta.

Per fornire una soluzione alla domanda qui è il codice completo incluso il file yaml per metterlo nel contenitore del servizio:

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 }

Sto usando un formattatore di campo personalizzato per includere iframe di Youtube. Come rimuovo queste opzioni X-Frame per visualizzare YouTube iframe Player?
JayKandari,

Questa risposta dovrebbe essere accettata ora - è ben pensata e completa. Grazie anche per il codice drop-in, molto utile.
Storsey,

6

4k4 offre un'ottima soluzione, ma può anche essere

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

migliore di

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


1
Si noti che allow-from uriè obsoleto e non funzionerà più sui browser moderni. Le uniche 2 opzioni che questa intestazione ha al momento è sameorigino deny. X-Frame-Options MDN
Beebee,

2

È molto semplice sostituire le intestazioni .htaccesscon una singola istruzione

Header set X-FRAME-OPTIONS "ALLOWALL"

In alternativa puoi farlo applicare solo a determinate condizioni usando le espressioni if ​​apache statement

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

e quindi puoi chiamare l'URL aggiungendolo embednella stringa di query

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

Affinché ciò funzioni, è necessario Apache 2.4 o versioni successive e il modulo delle intestazioni abilitato. Se non abilitato, forse puoi abilitarli con

sudo a2enmod headers
sudo service apache2 restart

1

Ora c'è un modulo scaricabile per Drupal 8: X-Frame-Options Configuration

Questo modulo può essere utilizzato per impostare l'intestazione x-frame-options sul tuo sito Web con la direttiva appropriata. Questo potrebbe essere utile quando vuoi includere una delle pagine del tuo sito all'interno di un iframe in un altro sito.

Le direttive devono essere:

  1. NEGARE
  2. SAMEORIGIN
  3. ALLOW-FROM uri (attualmente [25-10-2018] non accettato da Chrome né Safari). Ti sarà permesso di configurare quale uri.

0

Per i browser più recenti le ALLOW-FROM uriimpostazioni non funzionerebbero più, vedere "allow-from uri (obsoleto)" - sezione in https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame- Opzioni

Devi aggiungere

$response->headers->set('Content-Security-Policy', 'frame-ancestors https://ALLOWED.SITE/'); oltre a quanto proposto da wakh.ru:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.