Спасение от негативного поведенческого фактора (борьба с внешними proxy)

Сейчас в конкурентной борьбе не гнушаются использовать и методы накрутки негативного поведенческого фактора. В метрике Яндекса отчетливо видно, что есть закономерность у запросов:

  • Время на сайте 0 секунд
  • Примерно равное время между заходами
  • Чередование стран
  • Одинаковое разрешение экрана
  • Одинаковая OS
негативный поведенческий фактор releshop.ru reshetnick mike

Выбираем паттерн, по которому дуем искать «злоумышленников».

Т.к. большая часть клиентов это РФ и Казахстан, для определения злоумышленника мы решили выбрать всех веб-клиентов, кто заходит на наш сайт из других стран.

Хотя можно было бы выбрать и другие варианты или комбинации. Например, страна + юзер-агент (браузер) или страна + разрешение экрана (тут сложнее, т.к. придется запускать клиентский JS код для определения разрешения экрана клиента).

Блокируем злоумышленников из стран, где у нас нет клиентов.

Для блокировки по гео-данным можно использовать много разных механизмов, библиотек и сервисов, в зависимости от нагрузки на ваш сайт, какие модули включены у вас на хостинге, и на каком языке программирования работает ваше веб-приложение (ваш сайт). Чтобы подобрать подходящее для вас, можно поискать в гугле поисковым запросом «[ваш язык программирования] geoip github».

В нашем случае у нашего хостинг-провайдера уже было установлено расширение geiop для языка php, на котором написан сайт клиента.

Пример кода на php

function is_ruClient() { $allowedCountries = array('RU', 'KZ'); // список разрешенных стран $clientCountry = geoip_country_code_by_name($_SERVER["HTTP_X_REAL_IP"]); // получаем гео-код клиента по его ip-адресу $result = in_array($clientCountry, $allowedCountries); // проверяем, совпадает ли гео-код клиента со списком разрешённых стран return $result; // возвращаем ответ (true/false) } if (is_ruClient() == false) { // если клиент не из списка разрешенных стран header("location: https://thisxdoesnotexist.com/"); // пересылаем его на другой сайт exit(); }

И вуаля! Переходы не из РФ остановились.

Рынок сбыта у этого бизнеса находится в РФ, поэтому блокировка иностранных IP не повлияла на продажи.

Надеюсь, кому-то будет полезно! (Над материалом работали ребята из dynamics.moscow)

0
31 комментарий
Написать комментарий...
Виктор Петров

Ну по факту-то скручивать ПФ ходят из местных сетей - "метрополитен", tele2 и ещё парочка. Заблочить бурж - толку не будет.
Мы вообще проводили эксперимент: откровенно ботовые сетки выводили на поддомен. Потом выяснилось, что людей туда многовато залетало, а толку для ПФ не оказалось от слова совсем. Это всё равно что воду решетом носить.
Проблема в том, что нормальную накрутку не выкупишь, нет пока ни единого алгоритма.
С моей точки зрения единственный способ - периодически обнулять ПФ, если они совсем свалились в негатив. Да, криво и коряво, да, ущерб для Гугла - некоторый. Но если нужны позиции в Яндекс - я других вариантов не вижу.

Ответить
Развернуть ветку
Vadim Rybkin

И каким образом обнуляете пф ?

Ответить
Развернуть ветку
Виктор Петров

смена URL с вариациями.
Яндекс легко индексирует, у него нет ограничений на обход и вывод в топ по мерикам домена - это заморочки Google. Но есть пачка метрик, которые держатся за URL - условно назовём эту белиберду "кармой домена", от запросного индекса до метрик ПФ.
Пока выглядит так, что оно работает, я на истину не претендую. 

Ответить
Развернуть ветку
Алексей Медведев

Лично мне кажется, что даже 30-100 переходов в месяц, с нулевым пребыванием на сайте, они докинут в копилку отрицательного ПФ. Потому от него лучше избавиться. Это, хоть чуть, но может помочь. Каждый день, один два робота заходят к вам из других стран. Известны ли они яше и гуглу как роботы, хрен их знает, как они учитываются тоже не известно. 

Ответить
Развернуть ветку
Виктор Петров

Хуже, когда направленная атака человекообразных, с прокачанными профилями, от человека никак не отличить. Им-то всё равно, они может и не ломать пришли, просто те же профили нагуливают, попутно топча всё, что в зоне видимости.

Ответить
Развернуть ветку
Dark Stack

Вы абсолютно правы, у меня такая фигня на сайте твориться. Почти 40% отказов и все боты из России, поэтому я даже заблокировать их не могу. При этом, у них даже IP-адреса и провайдеры разные.

Ответить
Развернуть ветку
Виктор Петров

Хорошо знакомая картина.
Пока Яндекс с ПФ не разберется - будет только расти и крепнуть, к сожалению. Ну, или Яндекс придётся скидывать со счетов и все усилия прилагать к продвижению в Google.

Ответить
Развернуть ветку
Максим Пряник

Крути в плюс сам себя

Ответить
Развернуть ветку
Dark Stack

Если модуль GeoIP установлен на сервере, то тогда можно блокировать и перенаправлять пользователей из других стран с помощью файла .htaccess:

GeoIPEnable On
GeoIPDBFile (Путь к файлу: GeoIP.dat)
SetEnvIf GEOIP_COUNTRY_CODE AS BlockCountry
SetEnvIf GEOIP_COUNTRY_CODE US BlockCountry
Deny from env=BlockCountry

Ну, а если на сервере не установлен GeoIP, то тогда можно воспользоваться API сервиса Sypex Geo. Потом просто можно делать GET-запросы и перенаправлять или блокировать пользователей из других стран.

Ответить
Развернуть ветку
Dark Stack

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

<?php
$is_bot = preg_match(
"~(Google|Yahoo|Rambler|Bot|Yandex|Spider|Snoopy|Crawler|Finder|Mail|curl)~i",
$_SERVER['HTTP_USER_AGENT']
);

$geo = !$is_bot ? json_decode(file_get_contents('http://api.sypexgeo.net/json/'), true) : [];

switch ($geo['country']['name_en']) {
case 'Germany':
header('Location: https://yandex.ru/');
break;
case 'Poland':
header('Location: https://yandex.ru/');
break;

default:
echo 'Все, ништяк!';
break;
}
?>

Google|Yahoo|Rambler|Bot|Yandex|Spider|Snoopy|Crawler|Finder|Mail|curl - это боты, которых данный скрипт будет пропускать независимо от страны.

Там, где Germany и Poland - вы можете написать любую страну. Добавлять страны тоже можно сколько угодно. Ну, а вместо редиректа на Yandex можно создать страницу с информацией об ограничение доступа и уже туда редиректить всех зарубежных пользователей.

Ответить
Развернуть ветку
Mike Reshetnick
Автор

Здесь получился хороший гайд собрался ) 
на сайт диснейленда чтобы переправляло надо еще написать ))

Ответить
Развернуть ветку
Dark Stack

Можно никого и никуда не перенаправлять. Например, с тем кодом, что написал - можно вообще, как угодно играться:

<?php
$is_bot = preg_match(
"~(Google|Yahoo|Rambler|Bot|Yandex|Spider|Snoopy|Crawler|Finder|Mail|curl)~i",
$_SERVER['HTTP_USER_AGENT']
);

$geo = !$is_bot ? json_decode(file_get_contents('http://api.sypexgeo.net/json/'), true) : [];

switch ($geo['country']['name_en']) {
case 'Russia':
print "IP-адрес: {$geo['ip']}";
print "Страна: {$geo['country']['name_ru']}";
print "Регион: {$geo['region']['name_ru']}";
print "Город: {$geo['city']['name_ru']}";
break;

default:
header('HTTP/1.0 404 Forbidden');
break;
}
?>

Теперь вместо редиректа для всех пользователей, кто не из России - скрипт будет отдавать 403 ошибку (доступ запрещен).

Ответить
Развернуть ветку
Zoibana

Что будет если сайт с данными по ip недоступен?

Насколько это замедляет работу сайта? Во-первых, сетевые задержки, во-вторых, объём файла.

Почему бы не получать файл в фоне и сохранять у себя, а для запросов в реальном времени обращаться не к удаленному серверу, а локально к файлу?

Ответить
Развернуть ветку
Dark Stack

Данные передаются в формате JSON, поэтому обычный пользователь даже не заметит какую-либо задержу. Ее можно увидеть только путем замера запроса. Да и многие сайты работают с API. Например, я делал CRM-систему, в которую было интегрировано около 30 различных API и на скорость веб-приложения это практически не повлияло.

Ответить
Развернуть ветку
Zoibana

Апи можно подключить хоть 100. Другой вопрос как это сделано. Если при каждом соединении с сайтом сайт в реальном времени обращается к 100 внешним апи, то это потенциальная дыра - раз, и загрузка сайта напрямую зависит от доступности всех 100 апи - это два. Плюс часто через апи тягается гораздо больший объём данных, чем это реально требуется. И все это передаётся по сети - это медленнее чем обращение к локальному файлу или бд, или тем более к кэшу.

А доступность сайтов с апи у нас в стране с гениальным Роскомнадзором - это лотерея.

Поэтому ваш пример для человека без понимания сути скорее даже вреден, чем полезен.

Ответить
Развернуть ветку
Dark Stack

Почитайте про GET-запросы, HTTP и Reset API, т. к. вы не совсем понимаете, что говорите. Например, я воспользовался API Aviasels, если они меняют информацию у себя на сайте, то и по API подтягивается новая цена. В таком случае что, использовать парсер и сохранять все данные в БД, а не использовать API? Вы сами не понимаете, что пишите?

Ответить
Развернуть ветку
Zoibana

Судя по всему, тут вы не понимаете о чем я веду речь.
У меня опыт в этой сфере 16 лет.
Я говорю про то, что апи нужно с умом подключать. Использовать апи можно и нужно.
Но нужно чтобы запросы выполнялись максимально в фоне, кэшировались полученные данные, обрабатывались исключения и нештатные ситуации, вроде недоступности какого-то апи и т.д.
Потому что ваш пример - ужасный пример. Который в случае возможной недоступности апи способен сделать недоступным сайт, на который он будет установлен

Ответить
Развернуть ветку
Dark Stack

Понял:) Я думал, что вы имеете ввиду то, что нужно вообще не пользоваться API из-за того, что данные хранятся на внешнем веб-ресурсе. Да, мой пример ужасный, но это всего-лишь пример и использовать его в продакшене - непрофессионально.

Ответить
Развернуть ветку
Dark Stack

Это же просто пример. Можно скачать базу IP-адресов с официального сайта Sypex Geo, а можно воспользоваться их API, как в примере. А так, вы правы - лучше устанавливать базу на сервер, т. к. в таком случае запрос будет выполнятся быстрее.

Ответить
Развернуть ветку
Zoibana

Просто сейчас незнающие люди скопируют ваш код и вставят к себе на сайт. А потом сайт с айпишниками вдруг ляжет и сайты этих людей окажутся недоступными тоже.

Поэтому в таких случаях нужно писать что не нужно использовать этот код в реальных приложениях, и что этот пример неоптимален.

Ответить
Развернуть ветку
Dark Stack

То есть 404 ошибку:

default:
header('HTTP/1.0 404 Forbidden');
break;

Я ошибку допустил, там должна быть ошибка 403, а не 404.

Ответить
Развернуть ветку
Anatoliy Poloz

да, наверное вариантов и атак и "спасений" сильно больше, но как пример с которого стоит начинать - норм.

Ответить
Развернуть ветку
Mike Reshetnick
Автор

если будут заявки можем в рекомендательном изложении написать

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Виктор Петров

Это спам, да. В спам обычно и залетает, толку то от такого маркетинга.

Ответить
Развернуть ветку
Andrey Vladimirsky

Ну блин, вы считаете, что поступили круто, и красавчики, вот так рубанув?
А ничего, что всегда есть часть аудитории, которая легитимная, и при этом ходит с нерусских ip? Довольно много людей сидят под vpn с иностранным ip, чтобы роскомнадзор им мешал жить, или, если за свою приватность боятся. Кто-то из под пальм может захотеть зайти, а кто-то из opera mini...

Ответить
Развернуть ветку
Mike Reshetnick
Автор

внимательно прочитайте, таких нет 

Ответить
Развернуть ветку
Алевтина Ефимова

Не поняла, по какому принципу, вы просто решили отрубить тех кто не из РФ? Накрутку могут осуществлять  и с российскими гео 🙈

Ответить
Развернуть ветку
Mike Reshetnick
Автор

Компания работает только на РФ, другие рынки сбыта до неё не возможны. С российским гео накрутки не зафиксировано.

Ответить
Развернуть ветку
Евгений Калинский

Вы понимаете, что то что Вы предлагаете бесполезно? Поведенческие оцениваются не у Вас на сайте, а на выдаче Яндекса.
Именно там Яндекс "видит" быстрые заходы-выходы с сайта. И все скрипты расположенные у вас - это как зайцу стоп-сигнал.
Да, конечно Метрика сообщает Яндексу о плохих поведенческих. Но это вторичный сигнал. Основной - выдача.
С таким же успехом можно не скрипты делать, а просто снять Метрику.
Но это не поможет с накруткой в выдаче.

Ответить
Развернуть ветку
Mike Reshetnick
Автор

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

Ответить
Развернуть ветку
28 комментариев
Раскрывать всегда