A ṣe idanimọ awọn bot “buburu” ti o pọju ati dina wọn nipasẹ IP

A ṣe idanimọ awọn bot “buburu” ti o pọju ati dina wọn nipasẹ IP

Ojo dada! Ninu nkan naa Emi yoo sọ fun ọ bii awọn olumulo ti alejo gbigba deede le mu awọn adirẹsi IP ti o ṣe agbejade fifuye pupọ lori aaye naa lẹhinna dina wọn nipa lilo awọn irinṣẹ alejo gbigba, “diẹ diẹ” ti koodu php yoo wa, awọn sikirinisoti diẹ.

Data igbewọle:

  1. Oju opo wẹẹbu ti a ṣẹda lori Wodupiresi CMS
  2. Alejo Beget (eyi kii ṣe ipolowo, ṣugbọn awọn sikirinisoti nronu abojuto yoo jẹ lati ọdọ olupese alejo gbigba pato yii)
  3. Oju opo wẹẹbu ti ṣe ifilọlẹ ni ibikan ni ibẹrẹ 2000 ati pe o ni nọmba nla ti awọn nkan ati awọn ohun elo
  4. PHP version 7.2
  5. WP ni ẹya tuntun
  6. Fun igba diẹ bayi, aaye naa bẹrẹ lati ṣe ina fifuye giga lori MySQL ni ibamu si data alejo gbigba. Ni gbogbo ọjọ iye yii kọja 120% ti iwuwasi fun akọọlẹ kan
  7. Gẹgẹbi Yandex. Aaye Metrica jẹ abẹwo nipasẹ awọn eniyan 100-200 fun ọjọ kan

Ni akọkọ, eyi ni a ṣe:

  1. Awọn tabili ibi ipamọ data ti sọ di mimọ ti awọn idoti ti a kojọpọ
  2. Awọn afikun ti ko wulo jẹ alaabo, awọn apakan ti koodu igba atijọ ti yọkuro

Ni akoko kanna, Emi yoo fẹ lati fa ifojusi rẹ si otitọ pe awọn aṣayan caching (awọn afikun caching) ni a gbiyanju, awọn akiyesi ṣe - ṣugbọn fifuye 120% lati aaye kan ko yipada ati pe o le dagba nikan.

Kini fifuye isunmọ lori awọn apoti isura infomesonu alejo gbigba dabi

A ṣe idanimọ awọn bot “buburu” ti o pọju ati dina wọn nipasẹ IP
Ni oke ni aaye ti o ni ibeere, ni isalẹ wa awọn aaye miiran ti o ni awọn cms kanna ati isunmọ ijabọ kanna, ṣugbọn ṣẹda fifuye kere si.

Анализ

  • Ọpọlọpọ awọn igbiyanju ni a ṣe pẹlu awọn aṣayan caching data, awọn akiyesi ni a ṣe ni ọpọlọpọ awọn ọsẹ (da, ni akoko yii alejo gbigba ko kọwe si mi pe Mo buru pupọ ati pe yoo ge asopọ)
  • Onínọmbà kan wa ati wiwa fun awọn ibeere ti o lọra, lẹhinna eto data data ati iru tabili ti yipada diẹ
  • Fun itupalẹ, a lo nipataki awọn AWStats ti a ṣe sinu (nipasẹ ọna, o ṣe iranlọwọ lati ṣe iṣiro adiresi IP ti o buru julọ ti o da lori iwọn ijabọ
  • Metiriki - metiriki n pese alaye nipa eniyan nikan, kii ṣe nipa awọn bot
  • Awọn igbiyanju wa lati lo awọn afikun fun WP ti o le ṣe àlẹmọ ati dina awọn alejo paapaa nipasẹ orilẹ-ede ti ipo ati awọn akojọpọ oriṣiriṣi
  • Ọna ti o jẹ ipilẹṣẹ patapata ti jade lati jẹ lati pa aaye naa fun ọjọ kan pẹlu akọsilẹ “A wa labẹ itọju” - eyi tun ṣee ṣe nipa lilo ohun itanna olokiki. Ni idi eyi, a nireti pe fifuye naa silẹ, ṣugbọn kii ṣe si awọn iye odo, niwon imọran WP da lori awọn kio ati awọn afikun bẹrẹ iṣẹ wọn nigbati "kio" kan waye, ati ṣaaju ki "kio" naa waye, awọn ibeere si ibi ipamọ data le tẹlẹ ṣe

Agutan

  1. Ṣe iṣiro awọn adirẹsi IP ti o ṣe ọpọlọpọ awọn ibeere ni igba diẹ.
  2. Ṣe igbasilẹ nọmba awọn deba si aaye naa
  3. Dina wiwọle si ojula da lori awọn nọmba ti deba
  4. Dina nipa lilo titẹ sii "Kẹ lati" ni faili .htaccess
  5. Emi ko ṣe akiyesi awọn aṣayan miiran, bii iptables ati awọn ofin fun Nginx, nitori Mo n kikọ nipa alejo gbigba

Ero kan ti han, nitorinaa o nilo lati ṣe imuse, bi laisi eyi…

  • Ṣiṣẹda awọn tabili lati ṣajọ data
    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;
    
  • Jẹ ki a ṣẹda faili kan ninu eyiti a yoo fi koodu sii. Awọn koodu yoo gba silẹ ninu awọn ìdènà tani tabili ati ki o pa a itan fun yokokoro.

    Koodu faili fun gbigbasilẹ awọn adirẹsi 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);
    
    

    Koko koodu naa ni lati gba adiresi IP ti alejo ki o kọ sinu tabili kan. Ti ip ba wa tẹlẹ ninu tabili, aaye cnt yoo pọ si (nọmba awọn ibeere si aaye naa)

  • Bayi nkan ẹru… Bayi wọn yoo sun mi fun awọn iṣe mi :)
    Lati ṣe igbasilẹ ibeere kọọkan si aaye naa, a so koodu faili pọ si faili WordPress akọkọ - wp-load.php. Bẹẹni, a yipada faili ekuro ati ni pato lẹhin oniyipada agbaye $wpdb ti wa tẹlẹ

Nitorinaa, ni bayi a le rii bii igbagbogbo eyi tabi adiresi IP yẹn ti samisi ni tabili wa ati pẹlu ago kọfi kan a wo nibẹ lẹẹkan ni gbogbo iṣẹju 5 lati loye aworan naa.

A ṣe idanimọ awọn bot “buburu” ti o pọju ati dina wọn nipasẹ IP

Lẹhinna daakọ nikan IP “ipalara”, ṣii faili .htaccess ki o ṣafikun si ipari faili naa

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

Iyẹn ni, ni bayi 94.242.55.248 - ko ni iwọle si aaye naa ko si ṣe agbejade fifuye lori aaye data

Ṣugbọn ni gbogbo igba ti didakọ nipa ọwọ bii eyi kii ṣe iṣẹ-ṣiṣe ododo pupọ, ati pe yato si, koodu ti pinnu lati jẹ adase

Jẹ ki a ṣafikun faili kan ti yoo ṣiṣẹ nipasẹ CRON ni gbogbo ọgbọn iṣẹju:

Koodu faili ti n ṣatunṣe .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)));

Koodu faili jẹ ohun rọrun ati alakoko ati imọran akọkọ rẹ ni lati mu awọn oludije fun didi ati tẹ awọn ofin idinamọ ni faili .htaccess laarin awọn asọye
# bẹrẹ_auto_deny_akojọ ati # atokọ_auto_deny_pari

Bayi IPs “ipalara” ti dina nipasẹ ara wọn, ati faili .htaccess dabi nkan bi eyi:

# 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

Bi abajade, lẹhin koodu yii bẹrẹ iṣẹ, o le rii abajade ninu igbimọ alejo gbigba:

A ṣe idanimọ awọn bot “buburu” ti o pọju ati dina wọn nipasẹ IP

PS: Ohun elo naa jẹ ti onkọwe, botilẹjẹpe Mo ṣe atẹjade apakan rẹ lori oju opo wẹẹbu mi, Mo ni ẹya ti o gbooro sii lori Habre.

orisun: www.habr.com

Fi ọrọìwòye kun