Разрешить показ сайта по фрейме для отдельных доменов

Главные вкладки

Аватар пользователя Alex_web Alex_web 9 октября 2020 в 12:27

Доброго времени суток!

К своему великому удивлению я обнаружил, что в вебвизоре метрики не работает сбор данных, т.к. у друпала, начиная с версии 7.5, по умолчанию разрешен показ сайта во фрейме только на своем домене https://www.drupal.org/node/2735873

После чего я добавил в settings.php строчку:
$conf['x_frame_options'] = 'FALSE';

Вебвизор заработал. И все бы ничего, но это, насколько я понимаю, небезопасно?
Вопрос. Как разрешить показ сайта во фремей только для определённых доменов?

Комментарии

Аватар пользователя Punk_UnDeaD Punk_UnDeaD 9 октября 2020 в 12:31
1

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
надо поэкспериментировать с несколькими значениями

если значение может быть только одно, то на каждом сайта в ифрейм пробросить домен, который котом указывать в заголовке ответа
или реферер смотреть

Аватар пользователя Alex_web Alex_web 9 октября 2020 в 13:15

Нужно разрешить показ во фрейме как минимум для двух доменов: вебвизор и собственный домен сайта.
Директива ALLOW-FROM uri в принципе бы решила задачу, но она уже не работает в новых версиях браузеров https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

И решение необходимо найти именно на уровне сайта, а не сервера.

Аватар пользователя cyberlex404 cyberlex404 10 октября 2020 в 0:58

Просто оставлю это здесь. Используйте Content-Security-Policy.


<?php

namespace Drupal\calculators\EventSubscriber;

use 

Drupal\Core\Config\ConfigFactoryInterface;
use 
Symfony\Component\EventDispatcher\EventSubscriberInterface;
use 
Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use 
Symfony\Component\HttpKernel\KernelEvents;

/**
 * Class ContentSecurityPolicySubscriber.
 *
 * @package Drupal\calculators\EventSubscriber
 */
class ContentSecurityPolicySubscriber implements EventSubscriberInterface {

  

/**
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  
protected $configFactory;

  

/**
   * XframeSubscriber constructor.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The factory for configuration objects.
   */
  
public function __construct(ConfigFactoryInterface $config_factory) {
    
$this->configFactory $config_factory;
  }

  

/**
   * Event handler.
   *
   * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
   *   The event.
   */
  
public function onKernelResponse(FilterResponseEvent $event) {
    
// todo: add for only frame route.
    
$response $event->getResponse();
    
$content 'frame-ancestors \'self\' *;';
    
$response->headers->set('Content-Security-Policy'$content);
  }

  

/**
   * {@inheritdoc}
   */
  
public static function getSubscribedEvents() {
    
$events[KernelEvents::RESPONSE][] = ['onKernelResponse', -10];
    return 
$events;
  }

}

?>
  calculators.frame_event_subscriber:
    class: Drupal\calculators\EventSubscriber\ContentSecurityPolicySubscriber
    arguments: ['@config.factory']
    tags:
      - { name: event_subscriber }