Для работы Вебвизора от Яндекс.Метрики необходима возможность отображения сайта во фрейме на сторонних сайтах. Модуль проактивной защиты Битрикса в целях безопасности добавляет заголовок X-Frame-Options: SAMEORIGIN, явно запрещающий это делать. Посмотрим, что можно сделать, если аналитика нужна, а жертвовать защитой ради этого не хочется.

Документация Яндекса для подобных случаев рекомендует на уровне NGINX отключать заголовок X-Frame-Options, если запрос пришел от них, основываясь на HTTP_REFERRER. Например, так:

location / {
        set $frame_options '';
        if ($http_referer !~ '^https?:\/\/([^\/]+\.)?(yourdomain\.com|webvisor\.com|metri[ck]a\.yandex\.(com|ru|by|com\.tr))\/'){
            set $frame_options 'SAMEORIGIN';
        }
        add_header X-Frame-Options $frame_options;
        ...
    }

Вариант плох тем, что HTTP_* заголовки передаются с клиента, что в общем случае сводит на нет всю идею подобной защиты

Content-Security-Policy

К счастью, прогресс не стоит на месте и на смену устаревшему X-Frame-Options пришел новый заголовок Content-Security-Policy, который нативно поддерживает white-list доменов, с которых браузер будет разрешать встраивание сайта в фрейм.

Стоит отметить, что в соответствии со спецификацией при одновременном указании обоих заголовков, устаревший будет проигнорирован. Поэтому есть смысл устанавливать их оба. Правда, в аналитику придется ходить через современные браузеры.

7.7.1. Relation to X-Frame-Options
This directive is similar to the X-Frame-Options header that several user agents have implemented. The ‘none’ source expression is roughly equivalent to that header’s DENY, ‘self’ to SAMEORIGIN, and so on. The major difference is that many user agents implement SAMEORIGIN such that it only matches against the top-level document’s location. This directive checks each ancestor. If any ancestor doesn’t match, the load is cancelled. [RFC7034] The frame-ancestors directive obsoletes the X-Frame-Options header.

If a resource has both policies, the frame-ancestors policy SHOULD be enforced and the X-Frame-Options policy SHOULD be ignored.

В итоге нам нужно добавить в конфигурацию NGINX следующие строки

location / {
    add_header X-Frame-Options SAMEORIGIN;
    add_header Content-Security-Policy "frame-ancestors 'self' https://metrika.yandex.ru https://metrika.yandex.by https://metrica.yandex.com https://metrica.yandex.com.tr https://*.webvisor.com";
}

Не забудьте также отключить опцию «Защита фреймов» в модуле проактивной защите, т.к. фактически мы перенесли этот функционал из приложения на уровень сервера с дополнительными разрешениями для Яндекса.

Больше статей и материалов по web-разработке в tg-канале - подписывайтесь!

Подписаться в telegram

Добавить комментарий

Ваш адрес email не будет опубликован.