Давеча пришел клиент со следующей жалобой: «Пользователи ставят расширение Советник.Яндекс и уходят на сайты конкурентов, следуя за более низкой ценой».
TL;DR:
* Настройте CSP-заголовки
* Настроили? Ужесточите политики.
И правда, при переходе на страницу товара с включенным расширением, происходил рендеринг спец. желтой панельки в шапке страницы с дополнительными предложениями.
Достаточно возмутительно, вы не находите?
Однако, бороться с этим можно. Надо лишь настроить `Content Security Policy`. Это политики безопасности контента, кто не в курсе. Так я и сделал. Полез на один из своих сайтов и оттуда скопировал преднастроенные доп. заголовки для типа содержимого HTML в MODX на сайт клиента.
В огнелисе все прекрасно заработало (т.е. сломалось), но в хроме ситуация была немного иная. Желтая панель пропала; при клике на иконку расширения, оно продолжило «давать советы» в отдельной модалке.
Если вы разрабатывали расширения для хрома, то знаете, что под каждый аддон хром выделяет отдельный процесс в котором расширение может выполнять собственные скрипты. Это если на пальцах. Очень крутая фишка.
Пришлось немного подробнее почитать про CSP и поэкспериментировать. В доке (https://content-security-policy.com/) и спеке (https://www.w3.org/TR/CSP2/#directive-sandbox) я наткнулся на директиву `sandbox`. Достаточно еще больше ужесточить политики, убрав значение `allow-same-origin`.
Теперь сайт запустился в «песочнице» и Яндекс больше не смог ничего посоветовать.
Здесь стоит отметить, что придется проверить работоспособность скриптов и произвести доп. настройки:
Вся статика и ответы сервера должны отдавать заголовок `Access-Control-Allow-Origin '*'`;
Если вы работе с `canvas`, то изображения, что рисуются, должны иметь свойство `pic.crossOrigin = «Anonymous»`;
Возможно есть еще кейсы по доп. настройкам. Я больше проблем не встретил.
Примеры политик также можно найти по первой ссылке. Там все достаточно подробно описано.
Также набросал специальный пакетик: modCSP. Он патчит типы содержимого, добавляя используемые нами политики. Появится на выходных в репозитории клуба.