Bagaimana cara menyematkan konten drupal di situs lain (menghapus X-Frame-Options: SAMAORIGIN)?

11

Saya mencoba membuat iframe dengan halaman drupal tetapi saya menerima pesan berikut:

Beberapa "Menolak untuk menampilkan (alamat halaman) dalam bingkai karena ini mengatur 'X-Frame-Options' ke 'SAMAORIGIN'."

Kemudian, saya mencoba mengubah tajuk respons di pengontrol halaman menggunakan

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

Dan saya menerima pesan berikut

Beberapa 'X-Frame-Options' tajuk dengan nilai yang bertentangan ('GOFORIT, SAMAORIGIN') ditemui ketika memuat '(alamat halaman)'. Kembali ke 'DENY'.

Inti Drupal menempatkan kode berikut di semua respons.

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

Jadi, bagaimana saya bisa menimpa header X-Frame-Options hanya untuk respon ini untuk menanamkan halaman ini di situs lain?

Saya menggunakan Drupal 8.0.0.

Victor Pereira
sumber

Jawaban:

4

The X-Frame-Optionssundulan tampaknya telah ditambahkan ke Drupal 8 untuk mencegah klik-jacking: https://www.drupal.org/node/2514152

Menurut pemberitahuan di atas, untuk menyematkan situs Drupal Anda di situs lain,

Pelanggan Respons baru perlu ditambahkan yang memiliki prioritas lebih tinggi sebagai FinishResponseSubscriber saat ini (lihat core.services.yml) untuk menimpa atau menghapus header - tergantung pada kasus penggunaan

Ini juga memberikan contoh kode:

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

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

Drupal 8 menambahkan header respons X-Frame-Options: SAMEORIGINke semua halaman. Ini mencegah bahwa konten termasuk dalam iframe di situs pihak ketiga.

Anda dapat memeriksa ini misalnya dalam pencarian gambar google bahwa konten Anda tidak muncul dalam bingkai pratinjau.

Fitur ini diperkenalkan di drupal 8 beta 13.

Catatan perubahan

Core sekarang dilindungi dari klik-jacking secara default (X-Frame-Options: SAMAORIGIN)

tidak benar dalam hal prioritas harus lebih tinggi, bahkan harus lebih rendah. Contoh kode mengubah permintaan tetapi harus mengubah respons.

Untuk memberikan solusi untuk pertanyaan di sini adalah kode lengkap termasuk file yaml untuk meletakkan ini dalam wadah layanan:

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
sumber
Saya menggunakan formatter bidang khusus untuk memasukkan iframes Youtube. Bagaimana cara menghapus X-Frame-Options ini untuk menampilkan YouTube iframe Player?
JayKandari
Jawaban ini harus diterima sekarang - sudah dipikirkan dengan matang dan lengkap. Juga terima kasih atas kode drop-in, sangat membantu.
Storsey
6

4k4 memberikan solusi hebat, tetapi juga mungkin

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

lebih baik dari pada

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

wakh.ru
sumber
1
Catatan yang allow-from urisudah usang dan tidak lagi berfungsi di peramban modern. Hanya 2 opsi yang dimiliki tajuk ini saat ini sameoriginatau deny. X-Frame-Options MDN
Beebee
2

Sangat mudah untuk menimpa header dari .htaccessdengan satu pernyataan

Header set X-FRAME-OPTIONS "ALLOWALL"

Atau Anda dapat membuatnya hanya berlaku pada kondisi tertentu menggunakan ekspresi if pernyataan apache

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

dan kemudian Anda bisa memanggil URL Anda menambahkan embeddalam string kueri Anda

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

Agar ini berfungsi, Anda perlu apache 2.4 atau lebih besar dan modul header diaktifkan. Jika tidak diaktifkan, Anda mungkin dapat mengaktifkannya dengan

sudo a2enmod headers
sudo service apache2 restart
GiorgosK
sumber
1

Sekarang ada modul yang dapat diunduh untuk Drupal 8: Konfigurasi X-Frame-Options

Modul ini dapat digunakan untuk mengatur header opsi-bingkai-x pada situs web Anda dengan arahan yang sesuai. Ini mungkin berguna ketika Anda ingin memasukkan salah satu halaman situs Anda di dalam iframe di situs lain.

Arahan harus:

  1. MENYANGKAL
  2. SAMAORIGIN
  3. ALLOW-FROM uri (Saat ini [2018-10-25] tidak diterima oleh chrome atau Safari). Anda akan diizinkan untuk mengkonfigurasi uri mana.
Artem
sumber
0

Untuk browser yang lebih baru, ALLOW-FROM uri-settings tidak akan berfungsi lagi, lihat "allow-from uri (usang)" - bagian di https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame- Pilihan

Anda perlu menambahkan

$response->headers->set('Content-Security-Policy', 'frame-ancestors https://ALLOWED.SITE/'); selain apa yang diusulkan wakh.ru:

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

drupov
sumber