Content Security Policy — загружаем только то, что разрешено
Content Security Policy — это новый стандарт, который направлен на то, чтобы защитить пользователя от угроз межсайтового выполнения сценариев.
Не буду пересказывать то, что уже хорошо написано в интернетах. Хорошо пишут в журнале Хакера.
Вот так выглядит мой набор правил CSP который разрешает (картинки, стили, скрипты):
- медиа ресурсы самого сайта
- коды счетчиков: Google Analitics и Яндекс.Метрика
- онлайн-консультант JivoSite
- Google карты
Код обработчика
namespace OlegPro; class Headers { /** * Set additional headers for CSP */ public static function addForFilter() { foreach (array('Content-Security-Policy', 'X-Content-Security-Policy', 'X-WebKit-CSP') as $nameHeader) { header(sprintf( "%s: default-src 'self' data: http://googleads.g.doubleclick.net http://www.google.com/ads/user-lists/ http://www.google.ru/ads/user-lists/ http://mc.yandex.ru; script-src 'self' 'unsafe-inline' 'unsafe-eval' http://www.google-analytics.com http://maps.google.com http://*.gstatic.com:* http://*.googleapis.com http://code.jivosite.com http://mc.yandex.ru http://www.googleadservices.com http://googleads.g.doubleclick.net http://cdn.voximplant.com; style-src 'self' 'unsafe-inline' http://code.jivosite.com:* http://mc.yandex.ru:* http://*.googleapis.com http://*.gstatic.com:*; img-src 'self' data: http://code.jivosite.com:* http://mc.yandex.ru:* http://*.googleapis.com http://*.gstatic.com:* http://www.google-analytics.com; font-src 'self' http://*.gstatic.com:*;", $nameHeader )); } } }
Код выше — это обработчик для 1С-Битрикс. Чтобы он заработал, его нужно сохранить в файл, например, по пути /local/php_interface/classes/handlers/headers.php, добавить в автозагрузку классов (в файле init.php вашего сайта):
\Bitrix\Main\Loader::registerAutoLoadClasses(null, array( '\OlegPro\Headers' => '/local/php_interface/classes/handlers/headers.php', ) );
А также навесить обработчик на событие OnEpilog главного модуля (в файле init.php вашего сайта):
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandlerCompatible('main', 'OnEpilog', array('\OlegPro\Headers', 'addForFilter'));
Для иных движков не трудно выдернуть нужное.
Хороший конструктор Content Security Policy правил.
5 комментариев
Добрый день,подскажите где находится init.php.
Добавил код,сайт выдает ошибку
Фатальная ошибка: объявление пространства имен оператор должен быть самый первый оператор в скрипте в /home/bitrix/www/bitrix/php_interface/init.php по строке 243
Андрей, да, верно. Обновил заметку.
Спасибо завтра опробую.
как понять строчками?