Сен
09
2021

Настраиваем Битрикс для Яндекс метрики с включенной защитой от фреймов

Проактивная защита в Битрикс

В Битрикс в модуле "Проактивная защита" есть очень полезная опция: Защита от фреймов. Я советую её включать в обязательном порядке.

Эта опция защищает сайт от Clickjacking атак. Если вкратце, то суть этой атаки сводится к тому, что злоумышленник заманивает администратора на свой сайт, на котором через iframe вставлен атакуемый сайт. Фрейм устанавливается прозрачным. Администратор, думая, что нажимает на кнопку на сайте хакера, на самом деле жмет кнопку на своем сайте. Получается хакер может от имени администратора выполнять действия на атакуемом сайте.

Когда включена защита от фреймов, сайт говорит браузеру, что его показ в iframe запрещен (через заголовок X-Frame-Options: DENY).

Защита от фреймов Битрикс

Работа с яндекс метрикой

В метрике есть инструменты, которые показывают аналитику поверх сайта: вебвизор, карта кликов... Проблема в том, что яндекс сайт отображает тоже через фрейм. А его работу мы запретили. У нас отображение содержимого внутри фрейма не поддерживается.

При открытии вебвизора, вы можете получить ошибку:

Невозможно воспроизвести посещение на данной странице. Возможные причины:
Не установлен код счётчика. Как проверить?
Установлен запрет на отображение страницы во фрейме. Как исправить?
Попробовать открыть на http://webvisor.com

Если код счетчика установлен верно, то проблема скорее всего в запрете отображения во фрейме. Исправим проблему того, что яндекс метрика не работает на сайте Битрикс.

Разрешаем работу сайта во фрейме для метрики

Для того, чтобы отключить на какой-то странице защиту от фреймов, нужно установить константу BX_SECURITY_SKIP_FRAMECHECK в true.

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

Всё что нам понадобится, это добавить код в /local/php_interface/init.php или /bitrix/php_interface/init.php. Смотря какой файл у вас есть, в тот и добавляйте. Если нет никакого, создайте файл.

if (isset($_SERVER['HTTP_REFERER']))
{
	/*
	*	При просмотре сайта через Яндекс.Метрику
	*	не запрещать показывать сайт во фрейме
	*/
	
	$metrikaHosts = [
		'webvisor.com',
		'metrika.yandex',
		'metrika.yandex.ru',
		'metrika.yandex.ua',
		'metrika.yandex.com',
		'metrika.yandex.by',
		'metrika.yandex.kz',
		$_SERVER['HTTP_HOST'],
	];
	
	$refHost = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);

	if (in_array($refHost, $metrikaHosts))
	{
		define('BX_SECURITY_SKIP_FRAMECHECK', true);
	}
}

Так же, пользователь в метрике может нажать "Взаимодействие с сайтом" и переходить по ссылкам на сайте прямо внутри метрики. В таком случае HTTP_REFERER будет содержать наш же сайт. Я это исправил добавлением $_SERVER['HTTP_HOST'] в разрешенные адреса.

Итог

Сайт защищен от Clickjacking атак, яндекс метрика отображает отчеты без ошибок.

Читайте так же.

Уязвимости web приложений применительно к Битрикс

Пожалуйста, оцените на сколько вам понравилась статья!
Голосов: 6 Среднее: 4.8