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

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

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

88
31 комментарий

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

5
Ответить

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

1
Ответить

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

Ответить

Если модуль 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-запросы и перенаправлять или блокировать пользователей из других стран.

4
Ответить

Для тех, у кого не установлен 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 можно создать страницу с информацией об ограничение доступа и уже туда редиректить всех зарубежных пользователей.

2
Ответить

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

Ответить

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

<?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 ошибку (доступ запрещен).

1
Ответить