Удаление Советника Яндекс.Маркета
Тема уже совсем не новая, но актуальности не теряет. Для тех, кто не в курсе, начнём с краткого описания проблемы.
Кто виноват
Человек заходит в Интернет-магазин, находит нужный ему товар и видит вот это (свежий пример из магазина Эльдорадо):
Т. е. вы трудитесь над своим магазином, вкладываете в него кучу труда и денег, а Яндекс на вашем же сайте предлагает купить те же товары у конкурентов по более низкой цене. «Вот это поворот!»
Так откуда же эта зараза берётся? Есть расширение для браузеров «Советник Яндекс.Маркета», которое Яндекс, естественно, подкидывает пользователям со многими своими продуктами.
Однако, расширение, которое пользователь установил сам или получил вместе со всякими панельками — это меньшая часть проблемы. Человек захотел себе такого Советника, человек сам установил его. В этом случае сложно предъявить претензии (иначе можно было бы судиться с разработчиками абсолютно всех расширений для браузеров).
Проблема обнаружилась и у нас при добавлении очередного телевизора. Конечно, никакого Советника Яндекса в рабочем браузере никто не устанавливал. Так как же он на сайте появился?
Дело в том, что Яндекс, видимо, имеет договорённость с разработчиками других популярных расширений и скрыто встраивает своего Советника в их продукты. В этом случае даже нельзя удалить расширение из браузера (обычным способом), т. к. его нет в списке установленных расширений. Чаще всего жалуются на расширение SaveFrom, но в нашем случае опытным путём было выяснено, что «троянец» находится в расширении friGate (может быть любое другое расширение, полный список знает только Яндекс).
Попахивает распространением вредоносного ПО, не правда ли?
А ещё проблема интересна тем, что вы понятия не имеете, у какой части ваших посетителей эта штука показывается и сколько денег она у вас уже украла.
Что делать
Во многих статьях рекомендуется использовать Content Security Policy. Что это такое, можно почитать здесь, здесь и ещё в куче мест. Суть в том, что эта вещь позволяет блокировать загрузку практически чего угодно с посторонних доменов.
Для широкой аудитории тема сложная, поэтому рассмотрим пример того, как это реализовано у нас (кстати, удивительно, что большинство крупных торговых сетей на момент написания статьи не решило или не решало эту проблему).
В файле .htaccess добавлен следующий заголовок (можно добавить этот заголовок и другими способами):
<IfModule mod_headers.c> Header set Content-Security-Policy "default-src 'self' *.televizor-x.ru data: 'unsafe-inline' https://www.youtube.com https://yandex.ru https://mc.yandex.ru https://yastatic.net 'unsafe-eval'" </IfModule>
Всё, текущая реализация Яндекс.Советника заблокирована (они постоянно его изменяют, поэтому работа этого способа в будущем не гарантируется).
Собственно, разберём составляющие этой строки:
- Header set — назначение заголовка.
- Content-Security-Policy — тип назначаемого заголовка.
- default-src — тип контента (в данном случае любой), для которого будет применён белый список доменов. Правильнее было бы использовать конкретные типы (script-src, img-src и т. д.), но тогда настройка сильно усложнится. Указывая только default-src, мы «говорим» браузеру, что можно загружать любые типы контента с перечисленных далее доменов.
- 'self' — разрешаем домен, с которого загружается сама страница (т. е. основной).
- *.televizor-x.ru — разрешаем все поддомены домена televizor-x.ru (* — любые символы).
- data: — разрешаем загрузку контента в виде base64 и подобном (без явного указания этого слова он перестаёт загружаться).
- 'unsafe-inline' — если не указать эту директиву, то весь встроенный в код страницы (inline) JS и CSS перестанет работать.
- 'unsafe-eval' — разрешает динамически исполняемый код, вроде eval().
- https://www.youtube.com, https://yandex.ru, https://mc.yandex.ru, https://yastatic.net — разрешённые домены других сайтов. В данном случае нужны для того, чтобы загружалось видео с YouTube и нормально работала Яндекс.Метрика.
Применять этот способ нужно аккуратно. После добавления базового правила "default-src 'self'" большинство сайтов просто перестанет нормально работать. Придётся отслеживать (например, в инструментах разработчика), что именно перестало грузиться, и добавлять это в список. Т. е. нужно будет проверить абсолютно весь функционал сайта на всех внешних и внутренних страницах. Особенно болезненно это будет для проектов, использующих массу сторонних скриптов.
Заблокированный советник выглядит в консоли примерно так:
P. S.
Здесь, наверняка, есть технические специалисты глубже знающие данный вопрос. Не стесняйтесь, оставляйте в комментариях уточнения и исправления.