Mir identifizéieren potenziell "béis" Bots a blockéieren se duerch IP

Mir identifizéieren potenziell "béis" Bots a blockéieren se duerch IP

Gudden Dag! Am Artikel wäert ech Iech soen wéi d'Benotzer vum normale Hosting IP Adresse kënnen opfänken, déi exzessiv Belaaschtung op de Site generéieren an se dann blockéieren mat Hosting Tools, et gëtt "e bëssen" vum PHP Code, e puer Screenshots.

Input Daten:

  1. Websäit erstallt op CMS WordPress
  2. Hosting Beget (dëst ass keng Annonce, awer d'Admin Panel Screenshots wäerte vun dësem speziellen Hosting Provider sinn)
  3. De WordPress Site gouf iergendwou am fréien 2000 gestart an huet eng grouss Zuel vun Artikelen a Materialien
  4. PHP Versioun 7.2
  5. WP huet déi lescht Versioun
  6. Zënter enger Zäit huet de Site ugefaang eng héich Belaaschtung op MySQL ze generéieren no den Hostingdaten. All Dag iwwerschratt dëse Wäert 120% vun der Norm pro Kont
  7. Laut Yandex. Metrica Site gëtt vun 100-200 Leit pro Dag besicht

Als éischt gouf dëst gemaach:

  1. Datebank Dëscher goufen vun akkumuléierten Dreck geläscht
  2. Onnéideg Plugins goufen behënnert, Sektioune vum alen Code goufen ewechgeholl

Zur selwechter Zäit wéilt ech Iech op d'Tatsaach opmierksam maachen datt Cachingoptiounen (Caching Plugins) probéiert goufen, Observatioune goufen gemaach - awer d'Laascht vun 120% vun engem Site war onverännert a konnt nëmme wuessen.

Wéi déi geschätzte Belaaschtung op Hosting-Datenbanken ausgesinn huet

Mir identifizéieren potenziell "béis" Bots a blockéieren se duerch IP
Am Top ass de Site a Fro, just drënner sinn aner Siten déi déiselwecht cms hunn an ongeféier deeselwechte Traffic, awer manner Belaaschtung erstellen.

Analyse

  • Vill Versich goufe mat Date-Caching-Optiounen gemaach, Observatioune goufen iwwer e puer Wochen duerchgefouert (glécklecherweis, während dëser Zäit huet de Hosting mir ni geschriwwen datt ech sou schlecht wier a géif ofgeschalt ginn)
  • Et gouf eng Analyse a Sich no luesen Ufroen, duerno goufen d'Datebankstruktur an den Dëschtyp liicht geännert
  • Fir d'Analyse hu mir haaptsächlech déi agebaute AWStats benotzt (iwwregens, et huet gehollef déi schlëmmst IP Adress ze berechnen op Basis vum Trafficvolumen
  • Metrik - d'Metrik liwwert Informatioun nëmmen iwwer Leit, net iwwer Bots
  • Et goufe Versuche fir Plugins fir WP ze benotzen déi Besucher filteren a blockéiere kënnen och no Land vu Standuert a verschidde Kombinatioune
  • Eng komplett radikal Manéier huet sech erausgestallt fir de Site fir en Dag mat der Notiz "Mir sinn ënner Ënnerhalt" zouzemaachen - dëst gouf och mam berühmten Plugin gemaach. An dësem Fall erwaarden mir datt d'Laascht erof geet, awer net op Nullwäerter, well d'WP Ideologie baséiert op Haken a Plugins fänken hir Aktivitéit un wann en "Hook" geschitt, a ier den "Hook" geschitt, Ufroen un d'Datebank kënnen scho gemaach ginn

Idea

  1. Berechent IP Adressen déi vill Ufroen an enger kuerzer Zäit maachen.
  2. Rekord d'Zuel vun Hits op de Site
  3. Block Zougang zu de Site baséiert op der Zuel vun Hits
  4. Blockéiert mat der "Verleegnen vun" Entrée an der .htaccess Datei
  5. Ech hunn aner Optiounen net berücksichtegt, wéi iptables a Regele fir Nginx, well ech schreiwen iwwer Hosting

Eng Iddi ass opgetaucht, also muss se ëmgesat ginn, well ouni dës ...

  • Schafen Dëscher fir Daten ze sammelen
    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;
    
  • Loosst eis e Fichier erstellen an deem mir de Code setzen. De Code wäert an de Spärkandidattabellen ophuelen an eng Geschicht fir Debugging behalen.

    Dateicode fir IP Adressen opzehuelen

    <?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);
    
    

    D'Essenz vum Code ass d'IP Adress vum Besucher ze kréien an se an eng Tabell ze schreiwen. Wann d'IP schonn an der Tabell ass, gëtt d'cnt Feld eropgesat (d'Zuel vun Ufroen op de Site)

  • Elo déi grujeleg Saach ... Elo brennen se mech fir meng Handlungen :)
    Fir all Ufro op de Site opzehuelen, verbannen mir de Dateicode mat der Haapt WordPress Datei - wp-load.php. Jo, mir änneren d'Kerneldatei a genee no der globaler Variabel $wpdb existéiert schonn

Also, elo gesi mir wéi dacks dës oder déi IP Adress an eiser Tabell markéiert ass a mat engem Kaffi Kaffi kucke mir eemol all 5 Minutten do fir d'Bild ze verstoen

Mir identifizéieren potenziell "béis" Bots a blockéieren se duerch IP

Da kopéiert einfach déi "schiedlech" IP, öffnen d'.htaccess-Datei a fügen se um Enn vun der Datei derbäi.

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

Dat ass et, elo 94.242.55.248 - huet keen Zougang zum Site a generéiert keng Laascht op der Datebank

Awer all Kéier wann dës Hand kopéiert ass net eng ganz gerecht Aufgab, an ausserdeem war de Code virgesinn autonom ze sinn

Loosst eis eng Datei addéieren déi iwwer CRON all 30 Minutten ausgefouert gëtt:

Fichier Code änneren .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)));

De Dateicode ass zimmlech einfach a primitiv a seng Haaptidee ass d'Kandidaten ze huelen fir ze blockéieren an d'Blockéierungsregelen an der .htaccess Datei tëscht de Kommentaren anzeginn.
# start_auto_deny_list an # end_auto_deny_list

Elo ginn "schiedlech" IPe vu sech selwer blockéiert, an d'.htaccess-Datei gesäit esou aus:

# 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

Als Resultat, nodeems dëse Code ufänkt ze schaffen, kënnt Dir d'Resultat am Hosting Panel gesinn:

Mir identifizéieren potenziell "béis" Bots a blockéieren se duerch IP

PS: D'Material ass dem Auteur, obwuel ech en Deel dovun op menger Websäit publizéiert hunn, krut ech eng méi erweidert Versioun op Habre.

Source: will.com

Setzt e Commentaire