他のサイトにdrupalコンテンツを埋め込む方法(X-Frame-Optionsを削除:SAMEORIGIN)?


11

drupalページでiframeを作成しようとしましたが、次のメッセージが表示されました。

複数「フレームでの表示(ページアドレス)が拒否されました。'X-Frame-Options 'が' SAMEORIGIN 'に設定されたためです。」

次に、ページコントローラーで応答のヘッダーを変更してみました

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

そして、私は次のメッセージを受け取りました

'(ページアドレス)'の読み込み中に、競合する値( 'GOFORIT、SAMEORIGIN')を持つ複数の 'X-Frame-Options'ヘッダーが見つかりました。「DENY」にフォールバック。

Drupalコアはすべての応答に次のコードを挿入します。

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

それで、このページを他のサイトに埋め込むために、この応答のみのX-Frame-Optionsヘッダーをオーバーライドするにはどうすればよいですか?

Drupal 8.0.0を使用しています。

回答:


4

X-Frame-Optionsヘッダは、クリックジャッキングを防ぐためにはDrupal 8に追加されているようだ:https://www.drupal.org/node/2514152

上記の通知によると、Drupalサイトを他のサイトに埋め込むには、

ヘッダーを上書きまたは削除するには、現在のFinishResponseSubscriber(core.services.ymlを参照)より優先度の高い新しい応答サブスクライバーを追加する必要があります-ユースケースに応じて

また、コード例も示します。

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

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

22

Drupal 8はX-Frame-Options: SAMEORIGINすべてのページに応答ヘッダーを追加します。これにより、コンテンツがサードパーティのサイトのiframeに含まれるのを防ぎます。

たとえば、Google画像検索で、コンテンツがプレビューフレームに表示されないことを確認できます。

この機能はdrupal 8ベータ13で導入されました。

変更記録

コアはデフォルトでクリックジャッキングから保護されるようになりました(X-Frame-Options:SAMEORIGIN)

優先度を高くする必要があるという点で正しくありません。実際、優先度を低くする必要があります。コード例は要求を変更しますが、応答を変更する必要があります。

ここでの質問に対するソリューションを提供するために、これをサービスコンテナーに配置するためのyamlファイルを含む完全なコードを示します。

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 }

YouTube iframeを含めるためにカスタムフィールドフォーマッターを使用しています。YouTube iframe Playerを表示するためにこれらのXフレームオプションを削除するにはどうすればよいですか?
JayKandari

この答えは今受け入れられるべきです-それはよく考え抜かれて完全です ドロップインコードにも感謝します、とても役に立ちます。
Storsey 2017年

6

4k4は優れたソリューションを提供しますが、

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

その時より良い

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


1
allow-from uri非推奨と近代的なブラウザで動作しなくなりますされています。現在このヘッダーにある2つのオプションは、sameoriginまたはだけですdenyX-Frame-Options MDN
Beebee

2

.htaccess単一のステートメントでヘッダーをオーバーライドするのは非常に簡単です

Header set X-FRAME-OPTIONS "ALLOWALL"

あるいは、ifステートメントのapache式を使用して特定の条件にのみ適用されるようにすることもできます

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

次にembed、クエリ文字列に追加してURLを呼び出すことができます

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

これを機能させるには、Apache 2.4以降と有効なヘッダーモジュールが必要です。有効にしていない場合は、おそらくそれらを有効にすることができます

sudo a2enmod headers
sudo service apache2 restart

1

Drupal 8用のダウンロード可能なモジュールが追加されました:X-Frame-Options Configuration

このモジュールを使用すると、適切なディレクティブを使用して、Webサイトにx-frame-optionsヘッダーを設定できます。これは、サイトのページの1つを別のサイトのiframe内に含める場合に役立ちます。

ディレクティブは次のようにする必要があります。

  1. 拒否する
  2. サムオリギン
  3. ALLOW-FROM uri(現在[2018-10-25]はChromeでもSafariでも受け入れられていません)。どのURIを構成することが許可されます。

0

新しいブラウザーの場合、ALLOW-FROM uri-settingsは機能しなくなります。https: //developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-の「allow-from uri(廃止)」セクションを参照してください。オプション

追加する必要があります

$response->headers->set('Content-Security-Policy', 'frame-ancestors https://ALLOWED.SITE/'); wakh.ruが提案したものに加えて:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.