Как отловить JS-редирект?
От: Kolesiki  
Дата: 22.06.20 01:07
Оценка:
Ребят, сразу скажу — я 1000 лет не занимался вебом, но что такое HTML и JS знаю. В средствах разработки и отладки JS вообще панда.

Итак, проблемка: есть сайт, которому нравится сливать мою инфу налево. Он средствами JS редиректит КАЖДУЮ свою страницу на яндекс, передавая ему оригинальную URL (я так понимаю, просто делает location = "на яндекс!"). После чего сам яндекс редиректит меня назад на страницу. Мне это нафиг не нужно. Как узнать, чей скрипт это делает? А если это скрипт внутри самой страницы, то как ему обрубить руки?

Хорошо, если дадите подсказку в целом: как отлаживать скрипты страницы? Вот есть некий div, на нём кликаешь и пошёл какой-то хитрый код исполняться — есть возможность сразу это перехватить и оттрассировать?

Благодарю за любую помощь!
Re: Как отловить JS-редирект?
От: Lazytech Ниоткуда  
Дата: 22.06.20 05:45
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Итак, проблемка: есть сайт, которому нравится сливать мою инфу налево. Он средствами JS редиректит КАЖДУЮ свою страницу на яндекс, передавая ему оригинальную URL (я так понимаю, просто делает location = "на яндекс!"). После чего сам яндекс редиректит меня назад на страницу. Мне это нафиг не нужно. Как узнать, чей скрипт это делает? А если это скрипт внутри самой страницы, то как ему обрубить руки?


Возможно, пригодится:
https://superuser.com/questions/1009571/how-to-prevent-url-redirects-in-chrome
Отредактировано 22.06.2020 5:47 Lazytech . Предыдущая версия .
Re: Как отловить JS-редирект?
От: halo Украина  
Дата: 22.06.20 09:53
Оценка: 5 (1)
Здравствуйте, Kolesiki, Вы писали:

K>Итак, проблемка: есть сайт, которому нравится сливать мою инфу налево. Он средствами JS редиректит КАЖДУЮ свою страницу на яндекс, передавая ему оригинальную URL (я так понимаю, просто делает location = "на яндекс!"). После чего сам яндекс редиректит меня назад на страницу. Мне это нафиг не нужно. Как узнать, чей скрипт это делает? А если это скрипт внутри самой страницы, то как ему обрубить руки?


Мне в голову первым делом тоже пришло решение с добавлением обработчика на onbeforeunload, но в такой обработчик не приходит целевой адрес, поэтому отсеять только трекинг, видимо, не будет возможным (+ если я не ошибаюсь, его можно заблокировать только назойливым окошком). Переопределить document/window.location, вроде как, тоже нельзя (Object.defineProperty не сработает; присвоение в location моментально редиректит страницу).

* Может, есть смысл заблокировать JavaScript именно на этом сайте вообще?
* Или настроить соответствующие расширения, которые блокировали бы такое поведение с любого сайта? Можно также написать небольшое расширение или расширить https://github.com/jparise/chrome-utm-stripper , где редиректы переопределяются здесь: https://github.com/jparise/chrome-utm-stripper/blob/03eb06f79bb20f0af364dfa958e166d6da3e6bd3/background.js#L18

K>Вот есть некий div, на нём кликаешь и пошёл какой-то хитрый код исполняться — есть возможность сразу это перехватить и оттрассировать?


В Chrome для такого div в отладчике будут видны все обработчики его событий. + в window.onbeforeunload можно попробовать console.trace().
Re: Как отловить JS-редирект?
От: Doom100500 Израиль  
Дата: 22.06.20 11:51
Оценка: 5 (1)
Здравствуйте, Kolesiki, Вы писали:

K>Благодарю за любую помощь!



Так может быть в полне легальном сценарии, когда заригистрировался и аутенфицировался на сайте через яндех. Тогда сайту нужно выполнить один ис OAuth2 flow. А они радотают на редиректах
Спасибо за внимание
Re[2]: Как отловить JS-редирект?
От: Kolesiki  
Дата: 22.06.20 16:39
Оценка:
Здравствуйте, halo, Вы писали:

H>* Может, есть смысл заблокировать JavaScript именно на этом сайте вообще?


Увы, нельзя. Ниже напишу моё расследование.

H>* Или настроить соответствующие расширения, которые блокировали бы такое поведение с любого сайта? Можно также написать небольшое расширение или расширить https://github.com/jparise/chrome-utm-stripper , где редиректы переопределяются здесь: https://github.com/jparise/chrome-utm-stripper/blob/03eb06f79bb20f0af364dfa958e166d6da3e6bd3/background.js#L18


ээ... я нинай. В принципе, скрипт делает как бы обычный переход со страницы на страницу. И вот это место хотелось бы заблочить. Но видя современные сжатые и обфускаканые сорсы JS, даже место такое найти нереально.
Re: Как отловить JS-редирект?
От: Kolesiki  
Дата: 22.06.20 17:07
Оценка: 89 (2)
Моё небольшое расследование: (если кому-то интересно, это "обычный" развлекательный сайт 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 нам вообще настанет хана.

Есть ещё какие-нибудь идеи?
Re[2]: Как отловить JS-редирект?
От: Kolesiki  
Дата: 22.06.20 19:21
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>Так может быть в полне легальном сценарии, когда заригистрировался и аутенфицировался на сайте через яндех.


нене. Когда загружаешь ленту, сайт уже знает, кто я такой и провалидировал меня. Редиректы со страниц идут исключительно для трассировки "кто что читает".
Re[2]: Как отловить JS-редирект?
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.06.20 15:23
Оценка:
Здравствуйте, 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.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как отловить JS-редирект?
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.06.20 15:26
Оценка:
Здравствуйте, Kolesiki, Вы писали:


K>Есть ещё какие-нибудь идеи?

Ещё идея — добавить href-сеттер к прототипу от window.location через greaseMonkey.
Не уверен, что это сработает — но тогда при попытке средиректиться будет вызываться твой код.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Как отловить JS-редирект?
От: halo Украина  
Дата: 23.06.20 18:58
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>ээ... я нинай. В принципе, скрипт делает как бы обычный переход со страницы на страницу. И вот это место хотелось бы заблочить.


Я оказался неправ. Расширение не поможет, поскольку не продоставляет возможности симулировать ответ. Т.е., следующее расширение для Chrome будет приводить к белому экрану с ERR_BLOCKED_BY_CLIENT:

manifest.json
{
    "name": "test",
    "version": "0",
    "manifest_version": 2,
    "background": {"scripts": ["main.js"]},
    "permissions": ["<all_urls>", "webRequest", "webRequestBlocking"]
}


main.js
function isBlocked(url) {
    ...
}

chrome.webRequest.onBeforeRequest.addListener(function(details) {
    if ( isBlocked(details.url) ) {
        return {cancel: true};
    }
}, {urls: ["<all_urls>"]}, ["blocking"]);


K>Но видя современные сжатые и обфускаканые сорсы JS, даже место такое найти нереально.


console.trace в window.beforeunload, pretty-print, точки останова и стек вызовов в отладчике тоже не дают ни за что зацепиться?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.