Мо ботҳои эҳтимолии "бад"-ро муайян мекунем ва онҳоро тавассути IP маҳкам мекунем

Мо ботҳои эҳтимолии "бад"-ро муайян мекунем ва онҳоро тавассути IP маҳкам мекунем

Рӯзи нағз! Дар мақола ман ба шумо мегӯям, ки чӣ тавр корбарони хостинги муқаррарӣ метавонанд суроғаҳои IP-ро, ки дар сайт сарбории аз ҳад зиёд тавлид мекунанд, дастгир кунанд ва сипас онҳоро бо истифода аз абзорҳои хостинг маҳкам кунанд, дар он ҷо "кам" коди php, чанд скриншотҳо хоҳад буд.

Маълумоти воридотӣ:

  1. Вебсайт дар CMS WordPress сохта шудааст
  2. Hosting Beget (ин таблиғ нест, аммо скриншотҳои панели администратор аз ин провайдери хостинг хоҳанд буд)
  3. Сомонаи WordPress дар ҷое дар аввали соли 2000 ба кор даромад ва дорои шумораи зиёди мақолаҳо ва маводҳо мебошад
  4. Версияи PHP 7.2
  5. WP дорои версияи охирини
  6. Муддате аст, ки сайт мувофиқи маълумоти хостинг сарбории баландро дар MySQL тавлид кард. Хар руз ин нишондиханда дар хар хисоб 120 фоизи нормаро ба чо меовард
  7. Мувофиқи Яндекс. Ба сайти Metrica дар як рӯз 100-200 нафар ворид мешаванд

Пеш аз ҳама, ин кор анҷом дода шуд:

  1. Ҷадвалҳои пойгоҳи додаҳо аз партовҳои ҷамъшуда тоза карда шуданд
  2. Васлкунакҳои нолозим хомӯш карда шуданд, қисмҳои рамзи кӯҳна хориҷ карда шуданд

Ҳамзамон, ман мехоҳам таваҷҷӯҳи шуморо ба он ҷалб намоям, ки имконоти кэш (плагинҳои кэш) озмуда шуданд, мушоҳидаҳо гузаронида шуданд - аммо сарбории 120% аз як сайт бетағйир монд ва танҳо метавонад афзоиш ёбад.

Сарбории тахминии пойгоҳи додаҳои хостинг чӣ гуна буд

Мо ботҳои эҳтимолии "бад"-ро муайян мекунем ва онҳоро тавассути IP маҳкам мекунем
Дар боло сайти мавриди назар аст, дар поён сайтҳои дигаре ҳастанд, ки ҳамон смс ва тақрибан як трафик доранд, аммо бори камтар эҷод мекунанд.

Таҳлил

  • Бо имконоти кэшкунии додаҳо кӯшишҳои зиёд анҷом дода шуданд, мушоҳидаҳо дар тӯли якчанд ҳафта гузаронида шуданд (хушбахтона, дар ин муддат хостинг ҳеҷ гоҳ ба ман нанавишт, ки ман ин қадар бад будам ва пайваст мешавам)
  • Таҳлил ва ҷустуҷӯи дархостҳои суст вуҷуд дошт, пас сохтори пойгоҳи додаҳо ва намуди ҷадвал каме тағир ёфт
  • Барои таҳлил, мо пеш аз ҳама AWStats-и дарунсохтро истифода бурдем (дар омади гап, он барои ҳисоб кардани бадтарин суроғаи IP дар асоси ҳаҷми трафик кӯмак кард.
  • Метрик - метрика танҳо дар бораи одамон маълумот медиҳад, на дар бораи ботҳо
  • Кӯшишҳои истифодаи плагинҳо барои WP вуҷуд доранд, ки метавонанд меҳмононро ҳатто аз рӯи кишвари ҷойгиршавӣ ва таркиби гуногун филтр ва манъ кунанд
  • Як роҳи комилан радикалӣ ин буд, ки сайтро барои як рӯз бо қайди "Мо дар нигоҳубин нигоҳ дорем" - ин инчунин бо истифода аз плагини машҳур анҷом дода шуд. Дар ин ҳолат, мо интизорем, ки сарборӣ коҳиш меёбад, аммо на ба сифр, зеро идеологияи WP ба қалмоқҳо асос ёфтааст ва плагинҳо ҳангоми рух додани "қалмоқ" фаъолияти худро оғоз мекунанд ва пеш аз пайдо шудани "қалмоқ" дархостҳо ба пойгоҳи додаҳо метавонанд аллакай сохта шудааст

Idea

  1. Суроғаҳои IP-ро ҳисоб кунед, ки дар муддати кӯтоҳ дархостҳои зиёд медиҳанд.
  2. Шумораи боздидҳоро дар сайт сабт кунед
  3. Дар асоси шумораи боздидҳо дастрасӣ ба сайтро манъ кунед
  4. Бо истифода аз вуруди "Рад кардан аз" дар файли .htaccess блок кунед
  5. Ман дигар вариантҳоро, ба монанди iptables ва қоидаҳо барои Nginx баррасӣ накардаам, зеро ман дар бораи хостинг менависам

Идея пайдо шуд, пас онро бояд амалй кард, чун бе ин...

  • Эҷоди ҷадвалҳо барои ҷамъоварии маълумот
    CREATE TABLE `wp_visiters_bot` (
    	`id` INT(11) NOT NULL AUTO_INCREMENT,
    	`ip` VARCHAR(300) NULL DEFAULT NULL,
    	`browser` VARCHAR(500) NULL DEFAULT NULL,
    	`cnt` INT(11) NULL DEFAULT NULL,
    	`request` TEXT NULL,
    	`input` TEXT NULL,
    	`data_update` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    	PRIMARY KEY (`id`),
    	UNIQUE INDEX `ip` (`ip`)
    )
    COMMENT='Кандидаты для блокировки'
    COLLATE='utf8_general_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=1;
    

    CREATE TABLE `wp_visiters_bot_blocked` (
    	`id` INT(11) NOT NULL AUTO_INCREMENT,
    	`ip` VARCHAR(300) NOT NULL,
    	`data_update` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    	PRIMARY KEY (`id`),
    	UNIQUE INDEX `ip` (`ip`)
    )
    COMMENT='Список уже заблокированных'
    COLLATE='utf8_general_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=59;
    

    CREATE TABLE `wp_visiters_bot_history` (
    	`id` INT(11) NOT NULL AUTO_INCREMENT,
    	`ip` VARCHAR(300) NULL DEFAULT NULL,
    	`browser` VARCHAR(500) NULL DEFAULT NULL,
    	`cnt` INT(11) NULL DEFAULT NULL,
    	`data_update` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    	`data_add` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
    	PRIMARY KEY (`id`),
    	UNIQUE INDEX `ip` (`ip`)
    )
    COMMENT='История всех запросов для дебага'
    COLLATE='utf8_general_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=1;
    
  • Биёед файлеро эҷод кунем, ки дар он кодро ҷойгир мекунем. Рамз дар ҷадвалҳои блоки номзадҳо сабт хоҳад кард ва барои ислоҳ кардани хатогиҳо таърих нигоҳ медорад.

    Рамзи файл барои сабти суроғаҳои IP

    <?php
    
    if (!defined('ABSPATH')) {
        return;
    }
    
    global $wpdb;
    
    /**
     * Вернёт конкретный IP адрес посетителя
     * @return boolean
     */
    function coderun_get_user_ip() {
    
        $client_ip = '';
    
        $address_headers = array(
            'HTTP_CLIENT_IP',
            'HTTP_X_FORWARDED_FOR',
            'HTTP_X_FORWARDED',
            'HTTP_X_CLUSTER_CLIENT_IP',
            'HTTP_FORWARDED_FOR',
            'HTTP_FORWARDED',
            'REMOTE_ADDR',
        );
    
        foreach ($address_headers as $header) {
            if (array_key_exists($header, $_SERVER)) {
    
                $address_chain = explode(',', $_SERVER[$header]);
                $client_ip = trim($address_chain[0]);
    
                break;
            }
        }
    
        if (!$client_ip) {
            return '';
        }
    
    
        if ('0.0.0.0' === $client_ip || '::' === $client_ip || $client_ip == 'unknown') {
            return '';
        }
    
        return $client_ip;
    }
    
    $ip = esc_sql(coderun_get_user_ip()); // IP адрес посетителя
    
    if (empty($ip)) {// Нет IP, ну и идите лесом...
        header('Content-type: application/json;');
        die('Big big bolt....');
    }
    
    $browser = esc_sql($_SERVER['HTTP_USER_AGENT']); //Данные для анализа браузера
    
    $request = esc_sql(wp_json_encode($_REQUEST)); //Последний запрос который был к сайту
    
    $input = esc_sql(file_get_contents('php://input')); //Тело запроса, если было
    
    $cnt = 1;
    
    //Запрос в основную таблицу с временными кондидатами на блокировку
    $query = <<<EOT
        INSERT INTO wp_visiters_bot (`ip`,`browser`,`cnt`,`request`,`input`)
            VALUES  ('{$ip}','{$browser}','{$cnt}','{$request}','$input')
             ON DUPLICATE KEY UPDATE cnt=cnt+1,request=VALUES(request),input=VALUES(input),browser=VALUES(browser)
    EOT;
    
    //Запрос для истории
    $query2 = <<<EOT
        INSERT INTO wp_visiters_bot_history (`ip`,`browser`,`cnt`)
            VALUES  ('{$ip}','{$browser}','{$cnt}')
             ON DUPLICATE KEY UPDATE cnt=cnt+1,browser=VALUES(browser)
    EOT;
    
    
    $wpdb->query($query);
    
    $wpdb->query($query2);
    
    

    Моҳияти код ин аст, ки суроғаи IP-и меҳмонро дарёфт кунед ва онро дар ҷадвал нависед. Агар IP аллакай дар ҷадвал бошад, майдони cnt зиёд карда мешавад (шумораи дархостҳо ба сайт)

  • Ҳоло даҳшатнокаш... Ҳоло барои ин кирдорам маро сӯзонанд :)
    Барои сабт кардани ҳар як дархост ба сайт, мо рамзи файлро ба файли асосии WordPress - wp-load.php пайваст мекунем. Бале, мо файли ядроро иваз мекунем ва маҳз пас аз он ки тағирёбандаи глобалии $wpdb аллакай мавҷуд аст

Ҳамин тавр, ҳоло мо метавонем бубинем, ки ин ё он суроғаи IP дар ҷадвали мо чӣ қадар вақт қайд карда мешавад ва мо бо як коса қаҳва дар ҳар 5 дақиқа як маротиба ба он ҷо менигарем, то тасвирро фаҳмем.

Мо ботҳои эҳтимолии "бад"-ро муайян мекунем ва онҳоро тавассути IP маҳкам мекунем

Пас, танҳо IP-и "зараровар" -ро нусхабардорӣ кунед, файли .htaccess -ро кушоед ва онро ба охири файл илова кунед.

Order allow,deny
Allow from all
# start_auto_deny_list
Deny from 94.242.55.248
# end_auto_deny_list

Ин аст, ҳоло 94.242.55.248 - ба сайт дастрасӣ надорад ва дар пойгоҳи додаҳо сарборӣ эҷод намекунад

Аммо ҳар дафъа бо дастӣ нусхабардорӣ кардани ин кори чандон одилона нест ва илова бар ин, код барои худмухтор пешбинӣ шуда буд.

Биёед файлеро илова кунем, ки ҳар 30 дақиқа тавассути CRON иҷро карда мешавад:

Рамзи файл тағир додани .htaccess

<?php

/**
 * Файл автоматического задания блокировок по IP адресу
 * Должен запрашиваться через CRON
 */
if (empty($_REQUEST['key'])) {
    die('Hello');
}

require('wp-load.php');

global $wpdb;

$limit_cnt = 70; //Лимит запросов по которым отбирать

$deny_table = $wpdb->get_results("SELECT * FROM wp_visiters_bot WHERE cnt>{$limit_cnt}");

$new_blocked = [];

$exclude_ip = [
    '87.236.16.70'//адрес хостинга
];

foreach ($deny_table as $result) {

    if (in_array($result->ip, $exclude_ip)) {
        continue;
    }

    $wpdb->insert('wp_visiters_bot_blocked', ['ip' => $result->ip], ['%s']);
}

$deny_table_blocked = $wpdb->get_results("SELECT * FROM wp_visiters_bot_blocked");

foreach ($deny_table_blocked as $blocked) {
    $new_blocked[] = $blocked->ip;
}

//Очистка таблицы
$wpdb->query("DELETE FROM wp_visiters_bot");

//echo '<pre>';print_r($new_blocked);echo '</pre>';

$file = '.htaccess';

$start_searche_tag = 'start_auto_deny_list';

$end_searche_tag = 'end_auto_deny_list';

$handle = @fopen($file, "r");
if ($handle) {

    $replace_string = '';//Тест для вставки в файл .htaccess

    $target_content = false; //Флаг нужного нам участка кода

    while (($buffer = fgets($handle, 4096)) !== false) {

        if (stripos($buffer, 'start_auto_deny_list') !== false) {
            $target_content = true;
            continue;
        }

        if (stripos($buffer, 'end_auto_deny_list') !== false) {
            $target_content = false;

            continue;
        }

        if ($target_content) {
            $replace_string .= $buffer;
        }
    }
    if (!feof($handle)) {
        echo "Ошибка: fgets() неожиданно потерпел неудачуn";
    }
    fclose($handle);
}

//Текущий файл .htaccess
$content = file_get_contents($file);

$content = str_replace($replace_string, '', $content);

//Очищаем все блокировки в файле .htaccess
file_put_contents($file, $content);

//Запись новых блокировок
$str = "# {$start_searche_tag}" . PHP_EOL;

foreach ($new_blocked as $key => $value) {
    $str .= "Deny from {$value}" . PHP_EOL;
}

file_put_contents($file, str_replace("# {$start_searche_tag}", $str, file_get_contents($file)));

Рамзи файл хеле содда ва ибтидоӣ аст ва ғояи асосии он ин аст, ки номзадҳо барои бастан ва ворид кардани қоидаҳои блоккунӣ дар файли .htaccess байни шарҳҳо
# Рӯйхати_авто_кор кардан ва # Рӯйхати_авто_кор кардан

Ҳоло IP-ҳои "зараровар" худ аз худ баста мешаванд ва файли .htaccess чунин менамояд:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Order allow,deny
Allow from all

# start_auto_deny_list
Deny from 94.242.55.248
Deny from 207.46.13.122
Deny from 66.249.64.164
Deny from 54.209.162.70
Deny from 40.77.167.86
Deny from 54.146.43.69
Deny from 207.46.13.168
....... ниже другие адреса
# end_auto_deny_list

Дар натиҷа, пас аз он ки ин код кор мекунад, шумо метавонед натиҷаро дар панели хостинг бинед:

Мо ботҳои эҳтимолии "бад"-ро муайян мекунем ва онҳоро тавассути IP маҳкам мекунем

PS: Мавод аз они муаллиф аст, гарчанде ки ман як қисми онро дар вебсайти худ нашр кардам, ман дар Habre версияи васеътаре гирифтам.

Манбаъ: will.com

Илова Эзоҳ