Сергей Прохоров
16 сент. 2016 г., 12:02

Ишь ты, советник нашелся

Давеча пришел клиент со следующей жалобой: «Пользователи ставят расширение Советник.Яндекс и уходят на сайты конкурентов, следуя за более низкой ценой».
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. Он патчит типы содержимого, добавляя используемые нами политики. Появится на выходных в репозитории клуба.
Приветствую! Очень интересное наблюдение, ибо сам давно отключил в настройках Элементов Яндекса этого «умника» и думать забыл, а вы напомнили о проблеме, спасибо. Вы пишите «Появится на выходных в репозитории клуба.», соответственно шкурный вопрос, а в modstore.pro появится?
Тут сложный вопрос. Реализация блокировки требует доп. настроек сервера. Если на тачке отдаются некорректные заголовки, то этот модуль «сломает» вам сайт. Не думаю, что юзеры modstore.pro будут рады такому поведению модуля.
да видел такую блокировку делается без всяких расширений на чистом php и ничего не ломает ) может попадет на глаза выложу реализацию, элементарно блокироя вывод всплывающего этого блока
не рекламирую, просто вот на эту тему stopsovetnik.ru/premium.html
Речь идет про всплывающее окно экстеншена в самом браузере.
Я другое решение нашел:
< script type="text/javascript"> $('body').on("DOMNodeInserted", function(e, b, c) { var target = $(e.target); if(!target.is('div') || target.hasClass('firebugResetStyles')){ return; } if(target.find('[href*="//sovetnik.market.yandex"]').length){ console.log(target); console.log('Заблокирован советник'); target.remove(); } }); </script>
То есть я навешиваю событие на тег body на вставку новых элементов. Если в новом элементе найдены ссылки на советника, этот элемент тут же удаляется. Работает и в огнелисе и в хроме. Не требует никаких серверных настроек.
На этот счет список полезных DOM-событий:
DOMAttrModified — если изменился атрибут у элемента DOM; DOMAttributeNameChanged — если изменилось имя атрибута у элемента DOM; DOMCharacterDataModified — если изменился какой-либо текст, будь то обычный 'text node' или простой комментарий у элемента DOM; DOMElementNameChanged — если изменилось имя у элемента DOM; DOMNodeInserted — если у элемента DOM произошла вставка нового элемента; DOMNodeInsertedIntoDocument — если произошла вставка нового элемента в document; DOMNodeRemoved — если у элемента DOM произошло удаление какого-либо элемента; DOMNodeRemovedFromDocument — если произошло удаление какого-либо элемента в document; DOMSubtreeModified — если произошло какое-либо изменение в document.
Я другое решение нашел:
Решение работает и блокирует верхнюю желтую полосу, но появляется снизу справа что то типа информационного сообщения снизу справа, вот скриншот pastenow.ru/17EKP
Может кто знает как это побороть?
Сергей говорит, что как раз его метод решает это, но вот надо заморачиваться с настройками сервера и заголовков.

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