Моё небольшое расследование: (если кому-то интересно, это "обычный" развлекательный сайт fishki.net )
Итак, есть лента постов. При открытии поста, он весь загружается. Далее хитрый скрипт проверяет аргументы в URL и если там нет sign, переходит на yandex, передавая ему URL поста (в URL и в Referer) и конечно же, куки для отслеживания.
Яндекс возвращает целую простыню JS, которая формирует какую-то подпись и снова редиректит браузер обратно, но уже с добавкой "?sign=832085446311592%2C301828071123841" (как пример). sign для одной страницы каждый раз разный.
Фишки заново релоадят пост (спасибо, б***, за "экономию" трафика!) и скрипт проверяет sign (наверное, что-то вроде хэша). Если подпись правильная, скрипт добавляет к элементам страницы события (напр, позволяет отвечать на комменты). Таким образом, полностью отрубить JS — нельзя. Вычислять подпись — алгоритм неизвестен. Едиственный вариант — перехватить место вычисления подписи и заменить if (sign is valid) на pofig.
Что я "нахакал" в процессе расследования:
1. Ставим в hosts "127.0.0.1 yandex.ru" — там мы можем получать запросы вместо яндекса.
2. Написал собственный web-сервер (на C#) и создал подписанный сертификат на yandex.ru. Таким образом я могу делать абсолютно валидные подключения из браузера по SSL "якобы к яндексу".
3. Получил код JS, который яндекс отсылает браузеру.
4. Когда мой "яндекс-сервер" принимает запрос, пытался отвечать "301 moved permanently" (с оригинальной URL с и без sign) или "302 Found" — браузер входит в бесконечный рефреш поста.
Кстати, говносервер яндекса напрочь игнорирует "Accept-Encoding: identity" и продолжает настырно слать "chunked" контент, хотя я явно говорю, что поддерживаю только несжатые данные.
Короче, я всё контролирую на уровне протокола, но ни черта не могу поделать, чтобы отрубить напрочь шпионство на яндексе. Ибо монстроидоидный Хромой не даёт никакого контроля над скриптами и что они могут делать.
Вот такое говно нам подложил радостный разраб JS — не удивительно, что все дерьмокомпании так живо схватились за возможность "скриптячить" на страницах! А с WebAssembly нам вообще настанет хана.
Здравствуйте, Kolesiki, Вы писали:
K>Итак, проблемка: есть сайт, которому нравится сливать мою инфу налево. Он средствами JS редиректит КАЖДУЮ свою страницу на яндекс, передавая ему оригинальную URL (я так понимаю, просто делает location = "на яндекс!"). После чего сам яндекс редиректит меня назад на страницу. Мне это нафиг не нужно. Как узнать, чей скрипт это делает? А если это скрипт внутри самой страницы, то как ему обрубить руки?
Мне в голову первым делом тоже пришло решение с добавлением обработчика на onbeforeunload, но в такой обработчик не приходит целевой адрес, поэтому отсеять только трекинг, видимо, не будет возможным (+ если я не ошибаюсь, его можно заблокировать только назойливым окошком). Переопределить document/window.location, вроде как, тоже нельзя (Object.defineProperty не сработает; присвоение в location моментально редиректит страницу).
Здравствуйте, Kolesiki, Вы писали:
K>Благодарю за любую помощь!
Так может быть в полне легальном сценарии, когда заригистрировался и аутенфицировался на сайте через яндех. Тогда сайту нужно выполнить один ис OAuth2 flow. А они радотают на редиректах
Ребят, сразу скажу — я 1000 лет не занимался вебом, но что такое HTML и JS знаю. В средствах разработки и отладки JS вообще панда.
Итак, проблемка: есть сайт, которому нравится сливать мою инфу налево. Он средствами JS редиректит КАЖДУЮ свою страницу на яндекс, передавая ему оригинальную URL (я так понимаю, просто делает location = "на яндекс!"). После чего сам яндекс редиректит меня назад на страницу. Мне это нафиг не нужно. Как узнать, чей скрипт это делает? А если это скрипт внутри самой страницы, то как ему обрубить руки?
Хорошо, если дадите подсказку в целом: как отлаживать скрипты страницы? Вот есть некий div, на нём кликаешь и пошёл какой-то хитрый код исполняться — есть возможность сразу это перехватить и оттрассировать?
Здравствуйте, Kolesiki, Вы писали:
K>Итак, проблемка: есть сайт, которому нравится сливать мою инфу налево. Он средствами JS редиректит КАЖДУЮ свою страницу на яндекс, передавая ему оригинальную URL (я так понимаю, просто делает location = "на яндекс!"). После чего сам яндекс редиректит меня назад на страницу. Мне это нафиг не нужно. Как узнать, чей скрипт это делает? А если это скрипт внутри самой страницы, то как ему обрубить руки?
ээ... я нинай. В принципе, скрипт делает как бы обычный переход со страницы на страницу. И вот это место хотелось бы заблочить. Но видя современные сжатые и обфускаканые сорсы JS, даже место такое найти нереально.
Здравствуйте, Doom100500, Вы писали:
D>Так может быть в полне легальном сценарии, когда заригистрировался и аутенфицировался на сайте через яндех.
нене. Когда загружаешь ленту, сайт уже знает, кто я такой и провалидировал меня. Редиректы со страниц идут исключительно для трассировки "кто что читает".
Здравствуйте, Kolesiki, Вы писали:
K>Фишки заново релоадят пост (спасибо, б***, за "экономию" трафика!) и скрипт проверяет sign (наверное, что-то вроде хэша).
Этот скрипт, проверяющий хеш, найти удалось?
Если нет, то можно попробовать сделать поиск по файлам в дебаггере строки "location=" или "location" и поставить там бряку, чтобы найти стек трейс.
Явно что бы они там ни делали, всё упирается в window.location.
У меня описываемого эффекта нет — просто грузится тонна всякого говна, аналитика от всех аналитик провайдеров, гигабайты рекламы, и прочие хартбиты и сбор статистики.
В тексте min_footf.js удалось найти упоминания о редиректе на яндекс турбо,
(window.location.href="https://yandex.ru/turbo?text="+encodeURIComponent(o(window.location.href))+"&utm_source=aab&platform=desktop")
а также код типа
i=o(window.location.href.replace(/sign=\d+%2C\d+$/gi,""))
В общем, примерно там надо ставить бряку и смотреть, что происходит.
По результату — найти тот код, который собственно проверяет sign и делает редирект, и заглушить его.
Варианты надо смотреть — например, можно прикрутить greaseMonkey скрипт, который будет допиливать подходящий sign. Раз он каждый раз разный — должен быть способ его породить.
Либо пропустить min_footf.js через прокси, который подменит кусочек скрипта на return 0.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
K>Есть ещё какие-нибудь идеи?
Ещё идея — добавить href-сеттер к прототипу от window.location через greaseMonkey.
Не уверен, что это сработает — но тогда при попытке средиректиться будет вызываться твой код.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Kolesiki, Вы писали:
K>ээ... я нинай. В принципе, скрипт делает как бы обычный переход со страницы на страницу. И вот это место хотелось бы заблочить.
Я оказался неправ. Расширение не поможет, поскольку не продоставляет возможности симулировать ответ. Т.е., следующее расширение для Chrome будет приводить к белому экрану с ERR_BLOCKED_BY_CLIENT: