Gipaila namo ang mga potensyal nga "daotan" nga mga bot ug gibabagan kini pinaagi sa IP

Gipaila namo ang mga potensyal nga "daotan" nga mga bot ug gibabagan kini pinaagi sa IP

Maayong adlaw! Sa artikulo isulti ko kanimo kung giunsa ang mga tiggamit sa regular nga pag-host makadakop sa mga IP address nga makamugna og sobra nga pagkarga sa site ug dayon babagan kini gamit ang mga himan sa pag-host, adunay "gamay nga" php code, pipila ka mga screenshot.

Input nga datos:

  1. Website nga gihimo sa CMS WordPress
  2. Pag-host sa Beget (dili kini usa ka ad, apan ang mga screenshot sa admin panel gikan sa kini nga partikular nga taghatag sa hosting)
  3. Ang WordPress site gilunsad sa usa ka dapit sa sayong bahin sa 2000 ug adunay daghang mga artikulo ug materyales
  4. PHP nga bersyon 7.2
  5. Ang WP adunay pinakabag-o nga bersyon
  6. Sulod sa pipila ka panahon karon, ang site nagsugod sa pagmugna og taas nga load sa MySQL sumala sa hosting data. Kada adlaw kini nga kantidad milapas sa 120% sa naandan matag account
  7. Sumala sa Yandex. Ang Metrica site gibisitahan sa 100-200 ka tawo kada adlaw

Una sa tanan, kini gibuhat:

  1. Ang mga lamesa sa database gilimpyohan sa natipon nga basura
  2. Ang wala kinahanglana nga mga plugin gi-disable, ang mga seksyon sa outdated nga code gikuha

Sa parehas nga oras, gusto nako nga ipunting ang imong atensyon sa kamatuoran nga ang mga kapilian sa pag-cache (mga plugin sa pag-cache) gisulayan, gihimo ang mga obserbasyon - apan ang pagkarga sa 120% gikan sa usa ka site wala mausab ug mahimo ra nga motubo.

Unsa ang gibanabana nga pagkarga sa mga database sa pag-host

Gipaila namo ang mga potensyal nga "daotan" nga mga bot ug gibabagan kini pinaagi sa IP
Sa ibabaw mao ang site nga gipangutana, sa ubos ra ang ubang mga site nga adunay parehas nga cms ug gibana-bana nga parehas nga trapiko, apan naghimo og gamay nga load.

Анализ

  • Daghang mga pagsulay ang gihimo sa mga kapilian sa pag-cache sa datos, ang mga obserbasyon gihimo sa daghang mga semana (maayo na lang, niining panahona ang pag-host wala gyud misulat kanako nga ako daotan kaayo ug maputol)
  • Adunay usa ka pagtuki ug pagpangita alang sa hinay nga mga pangutana, unya ang istruktura sa database ug tipo sa lamesa gamay nga nabag-o
  • Alang sa pag-analisar, una namong gigamit ang built-in nga AWStats (sa ingon, nakatabang kini sa pagkalkulo sa pinakagrabe nga IP address base sa gidaghanon sa trapiko.
  • Metric - ang metric naghatag ug impormasyon bahin lang sa mga tawo, dili bahin sa mga bot
  • Adunay mga pagsulay sa paggamit sa mga plugins alang sa WP nga makasala ug maka-block sa mga bisita bisan sa nasud sa lokasyon ug lain-laing mga kombinasyon
  • Ang usa ka bug-os nga radikal nga paagi nahimo nga pagsira sa site sa usa ka adlaw nga adunay nota nga "Kami gipadayon" - gihimo usab kini gamit ang bantog nga plugin. Sa kini nga kaso, gipaabut namon nga ang load mahulog, apan dili sa zero nga mga kantidad, tungod kay ang WP nga ideolohiya gibase sa mga kaw-it ug ang mga plugins magsugod sa ilang kalihokan kung adunay usa ka "kawit" nga mahitabo, ug sa wala pa mahitabo ang "kawit", ang mga hangyo sa database mahimo gihimo na

Ideya

  1. Kalkulahin ang mga IP adres nga naghimo ug daghang mga hangyo sa mubo nga panahon.
  2. Irekord ang gidaghanon sa mga hit sa site
  3. I-block ang pag-access sa site base sa gidaghanon sa mga hit
  4. I-block gamit ang "Deny from" entry sa .htaccess file
  5. Wala nako gikonsiderar ang ubang mga kapilian, sama sa mga iptable ug mga lagda alang sa Nginx, tungod kay nagsulat ako bahin sa pag-host

Usa ka ideya ang nagpakita, mao nga kini kinahanglan nga ipatuman, ingon nga wala kini ...

  • Paghimo og mga lamesa aron matigom ang datos
    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;
    
  • Maghimo kita og usa ka file diin atong ibutang ang code. Ang code magrekord sa mga blocking nga mga lamesa sa kandidato ug magtipig og kasaysayan alang sa pag-debug.

    File code alang sa pagrekord sa mga IP address

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

    Ang esensya sa code mao ang pagkuha sa IP address sa bisita ug isulat kini sa usa ka lamesa. Kung ang ip naa na sa lamesa, ang cnt field madugangan (ang gidaghanon sa mga hangyo sa site)

  • Karon ang makahadlok nga butang ... Karon sunugon ko nila sa akong mga aksyon :)
    Aron irekord ang matag hangyo sa site, among gikonektar ang file code sa panguna nga file sa WordPress - wp-load.php. Oo, giusab namo ang kernel file ug tukma nga pagkahuman sa global variable nga $wpdb anaa na

Mao nga, karon atong makita kung unsa ka sagad kini o kana nga IP address gimarkahan sa among lamesa ug gamit ang usa ka mug sa kape nga among tan-awon didto kausa sa matag 5 minuto aron masabtan ang litrato.

Gipaila namo ang mga potensyal nga "daotan" nga mga bot ug gibabagan kini pinaagi sa IP

Dayon kopyaha lang ang "makadaot" nga IP, ablihi ang .htaccess file ug idugang kini sa katapusan sa file

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

Mao ra kana, karon 94.242.55.248 - walay access sa site ug dili makamugna og load sa database

Apan sa matag higayon nga ang pagkopya pinaagi sa kamot nga sama niini dili kaayo matarong nga buluhaton, ug labut pa, ang kodigo gituyo nga mahimong awtonomiya.

Atong idugang ang usa ka file nga ipatuman pinaagi sa CRON matag 30 minuto:

Ang file code nga nag-usab sa .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)));

Ang file code kay yano ug primitive ug ang nag-unang ideya niini mao ang pagkuha sa mga kandidato alang sa pag-ali ug pagsulod sa mga lagda sa pag-block sa .htaccess nga file tali sa mga komentaryo
# start_auto_deny_list ug # end_auto_deny_list

Karon ang "makadaot" nga mga IP gibabagan sa ilang kaugalingon, ug ang .htaccess nga file ingon niini:

# 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

Ingon usa ka sangputanan, pagkahuman magsugod kini nga code, makita nimo ang resulta sa panel sa pag-host:

Gipaila namo ang mga potensyal nga "daotan" nga mga bot ug gibabagan kini pinaagi sa IP

PS: Ang materyal mao ang tagsulat, bisan kung gipatik nako ang bahin niini sa akong website, nakakuha ako usa ka labi nga gipalapdan nga bersyon sa Habre.

Source: www.habr.com

Idugang sa usa ka comment