Блокировщик нежелательных яваскриптов

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Реакции
5 738
Баллы
113
Давно меня беспокоила проблема непонятных скриптов на различных сайтах. Когда профили нагуливаются, боты запросто могут забрести то на срытый майнер, то на эксплойт. Может попасться и безобидный скрипт, но настолько требовательный к вычислительным мощностям, что просто крашит зеннопостер. Вот так и случилось у меня вчера вечером. Ни с того ни с сего, все шаблоны зависли, кубик сохранения профиля сохранялся по 5-8 минут, кнопки перестали нажиматься, даже кубик капмонстра стал постоянно сбоить. Даже в багтрекер написал. Но начал смотреть более внимательно и обнаружил, что все боты застряли на вот этом сайте. При загрузке всего содержимого сайта, начинаются глюки даже в проджектмейкере. Отключив загрузку скриптов, обнаружил что все хорошо, ничего не тормозит, эмуляция мышки стала опять работать. НО скрипты то мне нужны. Как же я буду нагуливать профиль если аналитика яндекса и гугла с фейсбуком не работают. Да еще эти майнеры, которые только и ждут когда им предоставят халявную мощность. И родилось решение сделать черный и белый список наподобие расширения AdBlock.
Итак. Имеем 2 списка.
DB_Black_List_Mainer.txt - здесь черный список доменов заподозренных в предоставлении скриптов для майнинга. этот список можно иметь в одном экземпляре и иногда обновлять его.
DB_White_List_JS.txt - здесь белый список доменов с которых мы хотим загружать яваскрипты. Для нагуливания кук туда пишем всякие метрики, фейсбуки, инстаграмы ну и подобное. Если работа идет с таргертированным сайтом, то его обязательно прописываем. я там накидал несколько строк. дополните своими. этот список можно иметь в нескольких вариантах и подключать нужный. ну или просто для каждого шаблона иметь свой рядом в папочке.
В шаблоне подсоединяем их как списки. Делаем кубик C# и вставляем этот код. выполнять в начале работы шаблона.
C#:
Развернуть Свернуть Копировать
var Black_List_Mainer     =  project.Lists["Black_List_Mainer"];  // список с блокируемыми доменами. майнеры и иже с ними
var White_List_JS        =  project.Lists["White_List_JS"];        // список с разрешенными доменами для яваскриптов.
///// формирование белого листа JS ////////////////
string White_List_JS_regex =  @"(?<=(^|\r\n))((?!(";
string res="";
for (int i=0; i<White_List_JS.Count; i++){
    string data=White_List_JS[i];
    res=res+data.Replace(".",@"\.")+"|";
}
res=res.TrimEnd(new char[] { '|' });
White_List_JS_regex = White_List_JS_regex + res + @")).)*(\.js)";
List<string> White_List_JS_list = new List<string>() { };
White_List_JS_list.Add(White_List_JS_regex);
/////////////////////////////////////////////////////
instance.SetContentPolicy("BlockList", Black_List_Mainer, White_List_JS_list);

как видно на скриншоте, при загрузке неизвестного подозрительного сайта, загружаются и выполняются только разрешенные яваскрипты, а неизвестные не загружаются.
весь остальной контент загружается без проблем. Думаю будет полезна в шаблонах для нагуливания кук и при работе с таргертированным сайтом с которого необходимо переходить в неизвестность.

49012


PS. Пока писал эту статейку , запустил все доработанные шаблоны в работу. Поработали где то минут 30. Ошибок не наблюдал, нагрузка на процессор снизилась с 85-95% до 20-30%
 

Вложения

Последнее редактирование:
Изменил код, как оказалось точки это управляющие символы и их надо экранировать. и перезалил DB_White_List_JS.txt , добавил туда больше разрешений для "паразитного трафика" :)
 
Спасибо, что поделился наработкой, как раз то, что искал!
Позволил себе малость изменить регулярку:
было - *(\.js)";
стало - *\.(js|jpg|jpeg|png|svg|woff|woff2)";
Так можно ещё и трафик значительно сократить. Всякие счётчики всё равно не заметят грузишь ли ты картинки и шрифты с сайта.
 
Не могу понять. Смотрю описание метода и получается:

instance.SetContentPolicy("BlockList", Black_List_Mainer, White_List_JS_list);
1 параметр "BlockList" - разрешены все запросы кроме указанных
2 параметр Black_List_Mainer - список доменов для 1 параметра
3 параметр White_List_JS_list - список регулярок для 1 параметра

Получается что тут нет разрешенных скриптов для выполнения. Тут 2 варианта запрета либо по доменам, либо по регуляркам.

Или где я не понимаю?


P.S. Проверил.
Все как я и описал. Получается нет 2 разных листов. Белый и черный список. Тут 2 разных варианта блокировки и нет разрешения на выполнения скрипта.
А как происходит блокировка, отвечает первый параметр.
Либо мы блокируем:
- разрешены все запросы кроме
- запрещены все запросы кроме
 
Последнее редактирование:
Не могу понять. Смотрю описание метода и получается:

instance.SetContentPolicy("BlockList", Black_List_Mainer, White_List_JS_list);
1 параметр "BlockList" - разрешены все запросы кроме указанных
2 параметр Black_List_Mainer - список доменов для 1 параметра
3 параметр White_List_JS_list - список регулярок для 1 параметра

Получается что тут нет разрешенных скриптов для выполнения. Тут 2 варианта запрета либо по доменам, либо по регуляркам.

Или где я не понимаю?
SetContentPolicy работает и по доменам и по регуляркам. одновременно.
 
SetContentPolicy работает и по доменам и по регуляркам. одновременно.
Да, только метод блокировки или 1 или другой получается. То есть если я в блеклисте запрещаю майнеры, а в вайтлисте (как выше написано в вашем коде) прописываю метрику и ставлю instance.SetContentPolicy("BlockList"
То получается что я блокирую и метрику.
А у вас получается как написано, вайтлист это для тех которые нельзя блокировать.

Правильно я понимаю?
 
"DB_White_List_JS.txt - здесь белый список доменов с которых мы хотим загружать яваскрипты. Для нагуливания кук туда пишем всякие метрики, фейсбуки, инстаграмы ну и подобное. Если работа идет с таргертированным сайтом, то его обязательно прописываем. я там накидал несколько строк. дополните своими. "

По коду это тоже список блокировки получается:
instance.SetContentPolicy("BlockList", Black_List_Mainer, White_List_JS_list);


3 параметр Collection of regular expressions for "WhiteList" or "BlockList" policy. Default value is null.
 
По коду это тоже список блокировки получается:
instance.SetContentPolicy("BlockList", Black_List_Mainer, White_List_JS_list);

так и есть. только для White_List_JS_list используется регулярка с обратной логикой. она выбирает все кроме указанных в White_List_JS_list. поэтому блокирует все js, кроме указанных в белом листе.
 
"она выбирает все кроме указанных в White_List_JS_list. поэтому блокирует все js, кроме указанных в белом листе. " вот как раз я и говорю что нет)
за выбор Белого листа или Черного отвечает 1 параметр BlockList, а 3 параметр где мы пишем White_List_JS_list дает на выходе такую логику:
Разрешены все запросы кроме указанных в Списке Доменов, Списке Регулярок
 
Для примера - засуньте в White_List_JS_list

По вашей логике, он должен отрабатывать. Но у меня получается наоборот, он в запрете. Поэтому и хочу понять где тут ошибка
 
По скрину не вижу эту строчку в файле.
https://mc.yandex.ru/metrika/watch.js

У меня запрет. Проверил еще раз.
Спецом проверял. Удалил все из Белого листа и оставил там эту 1 строчку. Вся метрика грузится а вот этот один скрипт нет.
 
достаточно только части домена для разрешения. например yandex. разрешит грузить этот скрипт.

52516
 
Всю голову сломал. какой регуляркой, строчкой мне запретить выполнение данного скрипта? Только его.
 
Всю голову сломал. какой регуляркой, строчкой мне запретить выполнение данного скрипта? Только его.
здесь тема не запрета , а наоборот разрешения конкретных скриптов, от конкретных доменов. все остальное блокируется.
 
здесь тема не запрета , а наоборот разрешения конкретных скриптов, от конкретных доменов. все остальное блокируется.
Название темы:
Блокировщик нежелательных яваскриптов

Не суть.
Я там в регулярках не очень. От слова совсем. Объясни на пальцах)
Как я понял:
1) Формируем списки из 2 файлов. Один с доменами, другой с регулярками. Белый и черный лист.
Black_List_Mainer - это домены
White_List_JS - это регулярки

2) Далее идет обработка регулярок. Вот тут мне не совсем понятно, т.к. регулярки я не изучал.

3) Все это запихивается в
instance.SetContentPolicy

и получаем:
instance.SetContentPolicy("BlockList", Black_List_Mainer, White_List_JS_list);

BlockList - выбор как мы будем блокировать. По описанию метода это "Разрешены все запросы кроме приведенных в списках"
Black_List_Mainer - список с доменами. Опять же по мануалу в зависимости от 1 параметра (который у нас стоит BlockList), мы работаем либо с белыми списками=запрещены все кроме приведенных в списке, либо с черным списком=разрешены все кроме приведенных в списке
White_List_JS_list - список регулярок. Опять де по мануалу идеинтичен 2 параметру, только регулярки.


И тут у меня идет непонимание) Если как ты на скринах привел (если не шарпом, а кубиком настраивать), то получается 1 список где есть и домены и регулярки и либо мы разрешаем все кроме приведенных в списке, либо запрещаем все кроме приведенных в списке.

Где я тут не понимаю? И это не издевка (а то тут бывает на форуме)), хочу понять.
 
да все просто. instance.SetContentPolicy либо блокирует либо разрешает, для всего что указано во втором и третьем параметре функции. но в 3-м параметре используются значения для регулярок и если правильно составить регулярку , то можно при блокировке получить наоборот разрешение для указанных значений. вот этим я и воспользовался. список White_List_JS преобразуется в одну обратную регулярку, которая сохраняется в White_List_JS_list и затем подставляется в SetContentPolicy . можно и наоборот все разрешить, а в регулярку запихать запреты. тут одним словом поле для творчества огромное :)
 
  • Спасибо
Реакции: DocSpoc
Если не сложно. Можно объяснить регулярку? Понятно что придется запарится регулярками, но на практике быстрее разбираешься)
 
Спасибо!
Я правильно понял, что в вайтлист надо добавить свои домены?

domen1.
domen2.
domen3.
...

Субдомены прописывать не надо?
 
Спасибо!
Я правильно понял, что в вайтлист надо добавить свои домены?

domen1.
domen2.
domen3.
...

Субдомены прописывать не надо?
там не сами домены, а часть названия скриптов - метрика, аналитикс и т.д. и если у вас обычные сайты - то там и так уже список готов
 
  • Спасибо
Реакции: Phoenix78 и DocSpoc
var Black_List_Mainer = project.Lists["Black_List_Mainer"]; // список с блокируемыми доменами. майнеры и иже с ними var White_List_JS = project.Lists["White_List_JS"]; // список с разрешенными доменами для яваскриптов. ///// формирование белого листа JS //////////////// string White_List_JS_regex = @"(?<=(^|\r\n))((?!("; string res=""; for (int i=0; i<White_List_JS.Count; i++){ string data=White_List_JS; res=res+data.Replace(".",@"\.")+"|"; } res=res.TrimEnd(new char[] { '|' }); White_List_JS_regex = White_List_JS_regex + res + @")).)*(\.js)"; List<string> White_List_JS_list = new List<string>() { }; White_List_JS_list.Add(White_List_JS_regex); ///////////////////////////////////////////////////// instance.SetContentPolicy("BlockList", Black_List_Mainer, White_List_JS_list);
Заинтересовался сниппетом, как точно пользоваться, два списка понятно,
C#:
Развернуть Свернуть Копировать
instance.SetContentPolicy("BlockList", Black_List_Mainer, White_List_JS_list);

Этот пустой должен быть?
 
достаточно только части домена для разрешения
подскажите пожалуйста как составить правильно регулярку что бы получить в результате запрет загрузки только к примеру .gif
именно хочу реализовать через политику разрешения, сейчас покажу на скринах и примере

использую вайт лист, именно через него надо запретить, такая прихоть.. не спрашивайте)

76035


пробовал через символ каретки, что то не то...

76036
 
Последнее редактирование:
и еще не совсем понимаю что идет в приоритете...

к примеру если в списке регулярок делаю вот так

76038


то по идее должны же все скрипты грузиться, даже если доменов нету в списке "WhiteList_content_policy_domains", но грузятся только те домены которые прописаны
 
Ты как этот список собирал, вручную что-ли? Он довольно-таки приличный :(
у adblock есть ссылки откуда он их парсит и у других блокировщиков тоже есть. есть специальные ресурсы для сбора таких списков.
 
  • Спасибо
Реакции: p-sergei
При использовании этого метода, кубик уходит в ошибку, тк часть скриптов не загружена. Как это исправить не костылями?
А просто запретить выполнение одного скрипта или дива на сайте:
Спасибо.
 
При использовании этого метода, кубик уходит в ошибку, тк часть скриптов не загружена. Как это исправить не костылями?
Какой кубик в ошибку уходит?
А просто запретить выполнение одного скрипта или дива на сайте:
Есть API на C# для замены на уровне запросов.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)