Доброго времени суток!
К своему великому удивлению я обнаружил, что в вебвизоре метрики не работает сбор данных, т.к. у друпала, начиная с версии 7.5, по умолчанию разрешен показ сайта во фрейме только на своем домене https://www.drupal.org/node/2735873
После чего я добавил в settings.php строчку:
$conf['x_frame_options'] = 'FALSE';
Вебвизор заработал. И все бы ничего, но это, насколько я понимаю, небезопасно?
Вопрос. Как разрешить показ сайта во фремей только для определённых доменов?
Комментарии
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
надо поэкспериментировать с несколькими значениями
если значение может быть только одно, то на каждом сайта в ифрейм пробросить домен, который котом указывать в заголовке ответа
или реферер смотреть
Нужно разрешить показ во фрейме как минимум для двух доменов: вебвизор и собственный домен сайта.
Директива ALLOW-FROM uri в принципе бы решила задачу, но она уже не работает в новых версиях браузеров https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
И решение необходимо найти именно на уровне сайта, а не сервера.
нужен ли вам этот заголовок вообще?
он защищает от накруток рейтинга, в основном
Нашел такой способ https://www.unmoscerinonelweb.com/blog/drupal-7-blocks-external-frame-du... . Когда протестирую, отпишусь
Просто оставлю это здесь. Используйте 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;
}
}
?>class: Drupal\calculators\EventSubscriber\ContentSecurityPolicySubscriber
arguments: ['@config.factory']
tags:
- { name: event_subscriber }
Модуль для д9+ - https://www.drupal.org/project/xframe_allow_webvisor - просто установить, почистить кеш. Работает