Làm cách nào để nhúng nội dung drupal vào các trang web khác (loại bỏ X-Frame-Options: SAMEORIGIN)?


11

Tôi đã cố gắng tạo iframe bằng trang drupal nhưng tôi nhận được thông báo sau:

Nhiều "Từ chối hiển thị (địa chỉ trang) trong một khung vì nó đặt 'Tùy chọn khung X' thành 'SAMEORIGIN'."

Sau đó, tôi đã cố gắng thay đổi tiêu đề phản hồi trong bộ điều khiển trang bằng cách sử dụng

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

Và tôi đã nhận được tin nhắn sau

Nhiều tiêu đề 'Khung X-Tùy chọn' với các giá trị xung đột ('GOFORIT, SAMEORIGIN') gặp phải khi tải '(địa chỉ trang)'. Rơi trở lại 'DENY'.

Lõi Drupal đặt mã sau đây trong tất cả các phản hồi.

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

Vậy, làm cách nào tôi có thể ghi đè tiêu đề X-Frame-Options chỉ cho phản hồi này để nhúng trang này vào các trang web khác?

Tôi đang sử dụng Drupal 8.0.0.

Câu trả lời:


4

Các X-Frame-Optionstiêu đề dường như đã được thêm vào Drupal 8 để ngăn chặn nhấp cướp: https://www.drupal.org/node/2514152

Theo thông báo ở trên, để nhúng trang web Drupal của bạn vào các trang web khác,

Người đăng ký Phản hồi mới cần được thêm vào có mức độ ưu tiên cao hơn như Người hoàn thành hiện tại (xem core.service.yml) để ghi đè hoặc xóa tiêu đề - tùy thuộc vào trường hợp sử dụng

Nó cũng cung cấp một ví dụ mã:

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

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

22

Drupal 8 thêm tiêu đề phản hồi X-Frame-Options: SAMEORIGINcho tất cả các trang. Điều này ngăn nội dung được bao gồm trong iframe trên trang web của bên thứ ba.

Bạn có thể kiểm tra ví dụ này trong tìm kiếm hình ảnh google rằng nội dung của bạn không xuất hiện trong khung xem trước.

Tính năng này đã được giới thiệu trong drupal 8 beta 13.

Biên bản thay đổi

Core hiện được bảo vệ chống lại nhấp chuột theo mặc định (X-Frame-Options: SAMEORIGIN)

không đúng ở chỗ mức độ ưu tiên phải cao hơn, thực tế nó phải thấp hơn. Ví dụ mã thay đổi yêu cầu nhưng nó phải thay đổi phản hồi.

Để cung cấp một giải pháp cho câu hỏi ở đây là mã hoàn chỉnh bao gồm tệp yaml để đặt mã này vào thùng chứa dịch vụ:

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 }

Tôi đang sử dụng một trình định dạng trường tùy chỉnh để bao gồm các iframe Youtube. Làm cách nào để xóa các Tùy chọn khung X này để hiển thị Trình phát iframe YouTube?
JayKandari

Câu trả lời này nên được chấp nhận ngay bây giờ - nó đã được suy nghĩ thấu đáo và hoàn thành. Cũng cảm ơn cho mã thả, rất hữu ích.
Storsey

6

4k4 đưa ra giải pháp tuyệt vời, nhưng cũng có thể là

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

tốt hơn rồi

$ reply-> headers-> remove ('Tùy chọn khung X');


1
Lưu ý rằng allow-from urikhông được dùng nữa và sẽ không còn hoạt động trên các trình duyệt hiện đại. Chỉ có 2 tùy chọn mà tiêu đề này có tại thời điểm này là sameoriginhoặc deny. Tùy chọn X-Frame-MDN
Beebee

2

Rất đơn giản để ghi đè các tiêu đề .htaccessbằng một câu lệnh

Header set X-FRAME-OPTIONS "ALLOWALL"

Alternativelly bạn có thể làm cho nó chỉ áp dụng trên một số điều kiện nhất định bằng cách sử dụng biểu thức apache câu lệnh

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

và sau đó bạn có thể gọi URL của bạn thêm embedvào chuỗi truy vấn của bạn

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

Để làm việc này, bạn sẽ cần apache 2.4 trở lên và mô-đun tiêu đề được bật. Nếu không được bật, có lẽ bạn có thể kích hoạt chúng với

sudo a2enmod headers
sudo service apache2 restart

1

Hiện tại có một mô-đun có thể tải xuống cho Cấu hình tùy chọn Drupal 8: X-Frame

Mô-đun này có thể được sử dụng để đặt tiêu đề tùy chọn khung x trên trang web của bạn với chỉ thị thích hợp. Điều này có thể hữu ích khi bạn muốn đưa một trong các trang của trang web của bạn vào iframe trong một trang web khác.

Các chỉ thị phải là:

  1. PHỦ NHẬN
  2. SAMEORIGIN
  3. ALLOW-TỪ uri (Hiện tại [2018-10-25] không được chấp nhận bởi chrome cũng như Safari). Bạn sẽ được phép cấu hình uri nào.

0

Đối với các trình duyệt mới hơn, ALLOW-FROM uricài đặt sẽ không hoạt động nữa, hãy xem phần "allow-from uri (lỗi thời)" - trong https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame- Tùy chọn

Bạn cần phải thêm

$response->headers->set('Content-Security-Policy', 'frame-ancestors https://ALLOWED.SITE/'); ngoài những gì wakh.ru đề xuất:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.