eugene-1979

Рейтинг
3
Регистрация
11.08.2024

Вот такое коротенькое решение реализовал, если кому интересно:
    
    global $post;
    
    $IP = $_SERVER['REMOTE_ADDR'];
    
    if (isset($_SERVER['HTTP_CLIENT_IP'])) {
    
        $IP = $_SERVER['HTTP_CLIENT_IP'];
            
    }
    
    elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    
        $IP = $_SERVER['HTTP_X_FORWARDED_FOR'];
        
    };
    
    $IP = preg_replace('/[^0-9a-zA-Z\.\:]/', '', $IP);    
    
    // инициализируем массив запросов
    
    $requests = array();
    
    // загружаем лог для IP в массив
    
    $file_name = '/xxx/logs/IP/'.$IP.'.log';
    
    $file_name_blocked = '/xxx/logs/IP/'.$IP.'.blocked';
    
    if (@file_exists($file_name_blocked)) {
    
        header("Location: /403.php");
        
        die();
        
    };
    
    $result = @file_get_contents($file_name);
    
    if ($result != FALSE) {
    
        $lines = explode(PHP_EOL, $result);
        
        $i = 0;
        
        while ($i < (count($lines)-1)) {
        
            $requests[] = array(
    
                'date' => str_ireplace('DATE: ', '', $lines[$i]),
                'URL' => str_ireplace('URL: ', '', $lines[$i+1]),
                'postID' => str_ireplace('ID: ', '', $lines[$i+2]),
    
            );
            
            $i = $i+3;
        
        };
            
    };
    
    // добавляем в массив новый запрос
    
    $requests[] = array(
    
        'date' => date('Y-m-d H:i:s'),
        'URL' => $_SERVER['REQUEST_URI'],
        'postID' => $post->ID,
    
    );
    
    // записываем массив в лог
    
    $file = @fopen($file_name, 'w');
    
    if ($file != FALSE) {
    
        foreach($requests as $r)
        
            @fwrite($file, 'DATE: '.$r['date'].PHP_EOL.'URL: '.$r['URL'].PHP_EOL.'ID: '.$r['postID'].PHP_EOL);
            
        @fclose($file);
    
    };    
    
    // Анализируем и блокируем
    
    // Правило 1: обращение к advanced-search (ID=84889) три раза подряд с интервалом менее 5 секунд
    
    for($i=0;$i<count($requests);$i++) {
    
        $found = FALSE;
    
        if ($i >= 2) {
        
            if ($requests[$i-2]['postID'] == 84889 && $requests[$i-1]['postID'] == 84889 && $requests[$i]['postID'] == 84889)
            
                $found = TRUE;
        
        };
    
        if ($found) {
        
            $time1 = $requests[$i-2]['date'];
            
            $time2 = $requests[$i-1]['date'];
            
            $time3 = $requests[$i]['date'];
            
            $diff_21 = strtotime($time2) - strtotime($time1);
            
            $diff_32 = strtotime($time3) - strtotime($time2);
            
            if ($diff_21 < 5 && $diff_32 < 5)
                        
                @rename($file_name, $file_name_blocked);
        
        };
        
    };
  

Тяжело жить сайтовладельцу.

Еще и вот этих в брандмауэре пришлось забанить сразу диапазонами, ибо тоже с них лезли и качали чуть ли не весь сайт, создавая нагрузку на процессор:

34.*.*.* - Google Cloud
35.*.*.* - Google Cloud
132.145.*.* - Oracle Public Cloud
140.238.*.* - Oracle Public Cloud
152.67.*.* - Oracle Public Cloud
47.128.*.* - Amazon Data Services Singapore
47.129.*.* - Amazon Data Services Singapore
47.130.*.* - Amazon Data Services Singapore
47.131.*.* - Amazon Data Services Singapore
47.235.*.* - Alibaba Cloud
47.236.*.* - Alibaba Cloud
47.237.*.* - Alibaba Cloud
47.238.*.* - Alibaba Cloud
47.239.*.* - Alibaba Cloud
47.240.*.* - Alibaba Cloud
47.241.*.* - Alibaba Cloud
47.242.*.* - Alibaba Cloud
47.243.*.* - Alibaba Cloud
47.244.*.* - Alibaba Cloud
47.245.*.* - Alibaba Cloud
47.246.*.* - Alibaba Cloud

Vladimir K #:

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

все же очень хотелось накормить бы его леваком)

У меня на сайте в базе более 5000 страниц с информацией об изделиях.

Еще и боты официальные всякие лезут (не вредоносные которые) и много запрашивают страниц, но от них я избавился:

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^.*(Custom-AsyncHttpClient|ZoominfoBot|SurdotlyBot|AwarioBot|Go-http-client|ias_crawler|IABot|Amazonbot|AmazonAdBot|HeadlessChrome|GPTBot|ChatGLM-Spider|MJ12bot|OAI-SearchBot|SeznamBot|CriteoBot|ias-ie|ias-jp|ias-or|ias-va|AhrefsBot|BLEXBot|SemrushBot|DotBot).*$ [NC]
RewriteRule .* - [F,L]

Vladimir K #:


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

тк еще не было проектов откуда парсинг бы запретили на 100процентов. да усложнить и сделать парсинг дороже можно, но если на сайте есть инфа без пароля - ее заберут. будет сложно - закажут у школоты ручной парсинг и все.

Это хорошая идея сама по себе, и она мне нравится, но данный конкретный бот делает все, чтобы его было не отличить от нормального посетителя. Просто в логах потом видишь, что с каждого из указанных мной в первом комментарии IP-адреса скачали по 46 раз HTML-страницу моего сайта с перебором определенных параметров в HTML-форме через метод GET.  Собственно, только после просмотра лога и становится понятно, что это был бот. Он даже страницу моего сайта запрашивает специально с задержкой на случайное число минут от 1 до 3 примерно, чтобы максимально имитировать поведение человека. То есть не выдает все 46 запросов серверу сразу, а специально растягивает этот процесс на час-два. Вот такой вот бот.
dzthd #:

ищите другие закономерности помимо юзер-агента и ip.

Тут советуют капчу - ставьте не для всех, а после например, 50 просмотров разных страниц за час с одного ip. Потом еще 50.

Думаю, можно вот так сделать, компромиссно: юзер (с уникальным IP) зашел на страницу с формой и капчей, ввел ее правильно - все, при последующем обращении к форме капча ему больше никогда не выдается. Но если ввел неправильно, то капча при последующих обращениях к странице к форме будет показываться всегда. Да, при опечатке будет страдать нормальный юзер, но зато это отсечет программу. Чтобы разрулить это, можно раз в сутки очищать массив IP с результатами ввода капчи.
Artem189 #:
А если весь Macintosh в бан? Не вариант? Ко мне, например, с него пользователи почти не ходят.
Сайт англоязычный, а зарубежом Macintosh'ем многие пользуются. Чего греха таить - у меня и у самого MacBook Pro  :-)
Антоний Казанский #:

Я думаю, что это бесплатный контент, раз уж там характеристика изделий. 

Да, бесплатный контент.
Антоний Казанский #:
если это целевой сбор

Это целевой сбор, я это знаю достоверно.


Вам бурж трафик нужен? Парсят с зарубежный проксей.

========================
У меня англоязычный сайт.

Artisan #:
CAPTCHA
И то верно. Как-то я не подумал про нее. Не люблю ее, но походу действительно придется добавить.
12
Всего: 20