እምቅ "ክፉ" ቦቶችን እናሰላለን እና በአይፒ እንገድባቸዋለን

እምቅ "ክፉ" ቦቶችን እናሰላለን እና በአይፒ እንገድባቸዋለን

እንደምን ዋልክ! በጽሁፉ ውስጥ የመደበኛ ማስተናገጃ ተጠቃሚዎች በጣቢያው ላይ ከመጠን በላይ ጭነት የሚፈጥሩ የአይፒ አድራሻዎችን እንዴት እንደሚይዙ እና ከዚያም ማስተናገጃ መሳሪያዎችን በመጠቀም እንዴት እንደሚያግዱ እነግርዎታለሁ ፣ የ php ኮድ “ትንሽ” ፣ ጥቂት ቅጽበታዊ ገጽ እይታዎች ይኖራሉ ።

የግቤት ውሂብ፡-

  1. በCMS WordPress ላይ የተፈጠረ ድር ጣቢያ
  2. Begetን ማስተናገድ (ይህ ማስታወቂያ አይደለም፣ ነገር ግን የአስተዳዳሪ ፓነል ቅጽበታዊ ገጽ እይታዎች ከዚህ የተለየ አስተናጋጅ አቅራቢ ይሆናሉ)
  3. የዎርድፕረስ ድረ-ገጽ በ2000 መጀመሪያ ላይ የሆነ ቦታ የተጀመረ ሲሆን ብዙ ቁጥር ያላቸው መጣጥፎች እና ቁሳቁሶች አሉት
  4. ፒኤችፒ ስሪት 7.2
  5. WP የቅርብ ጊዜ ስሪት አለው።
  6. ለተወሰነ ጊዜ አሁን ጣቢያው በማስተናገጃው መረጃ መሰረት በ MySQL ላይ ከፍተኛ ጭነት መፍጠር ጀመረ. በየቀኑ ይህ ዋጋ በአንድ መለያ ከመደበኛው 120% ይበልጣል
  7. በ Yandex መሠረት. Metrica ጣቢያ በቀን ከ100-200 ሰዎች ይጎበኛል።

በመጀመሪያ ደረጃ, ይህ ተከናውኗል.

  1. የውሂብ ጎታ ሠንጠረዦች ከተጠራቀመ ቆሻሻ ተጠርገዋል።
  2. አላስፈላጊ ተሰኪዎች ተሰናክለዋል፣ ጊዜው ያለፈበት ኮድ ክፍሎች ተወግደዋል።

በተመሳሳይ ጊዜ, የመሸጎጫ አማራጮች (የመሸጎጫ ፕለጊኖች) ተሞክረዋል, ምልከታዎች ተካሂደዋል - ነገር ግን ከአንድ ጣቢያ የ 120% ጭነት አልተለወጠም እና ማደግ ብቻ ወደሚችል እውነታ ትኩረት መስጠት እፈልጋለሁ.

የውሂብ ጎታዎችን በማስተናገድ ላይ ያለው ግምታዊ ጭነት ምን ይመስላል

እምቅ "ክፉ" ቦቶችን እናሰላለን እና በአይፒ እንገድባቸዋለን
ከላይ በጥያቄ ውስጥ ያለው ጣቢያ ነው፣ ከታች ያሉት ሌሎች ተመሳሳይ ሴሜቶች እና በግምት ተመሳሳይ ትራፊክ ያላቸው፣ ግን አነስተኛ ጭነት የሚፈጥሩ ጣቢያዎች አሉ።

ትንታኔ

  • በመረጃ መሸጎጫ አማራጮች ብዙ ሙከራዎች ተደርገዋል፣ ምልከታዎች ከበርካታ ሳምንታት በላይ ተካሂደዋል (እንደ እድል ሆኖ፣ በዚህ ጊዜ አስተናጋጁ እኔ በጣም መጥፎ እንደሆንኩ እና ግንኙነቴ እንደሚቋረጥ ጽፎልኝ አያውቅም)
  • ለዘገየ መጠይቆች ትንተና እና ፍለጋ ነበር፣ከዚያም የመረጃ ቋቱ መዋቅር እና የሰንጠረዥ አይነት በትንሹ ተለውጧል
  • ለመተንተን በዋናነት አብሮ የተሰራውን AWStats እንጠቀማለን (በነገራችን ላይ በትራፊክ መጠን ላይ በመመርኮዝ በጣም መጥፎውን የአይፒ አድራሻ ለማስላት ረድቷል)
  • ሜትሪክ - መለኪያው ስለ ቦቶች ሳይሆን ስለሰዎች ብቻ መረጃ ይሰጣል
  • ጎብኝዎችን በየአካባቢው እና በተለያዩ ውህዶች እንኳን ሊያጣሩ እና ሊያግዱ የሚችሉ ለ WP ተሰኪዎችን ለመጠቀም ሙከራዎች ነበሩ።
  • ሙሉ በሙሉ አክራሪ መንገድ ጣቢያውን ለአንድ ቀን መዝጋት ሆነ "በጥገና ላይ ነን" በሚለው ማስታወሻ ይህ የተደረገውም ታዋቂውን ፕለጊን በመጠቀም ነው። በዚህ ሁኔታ የ WP ርዕዮተ ዓለም በመንጠቆዎች ላይ የተመሰረተ ስለሆነ እና ተሰኪዎች "መንጠቆ" በሚፈጠርበት ጊዜ ተግባራቸውን ስለሚጀምሩ እና "መንጠቆው" ከመከሰቱ በፊት ጭነቱ ይወድቃል ብለን እንጠብቃለን, ነገር ግን ወደ ዜሮ እሴት አይደለም. ቀድሞውኑ የተሰራ

ሐሳብ

  1. በአጭር ጊዜ ውስጥ ብዙ ጥያቄዎችን የሚጠይቁ የአይፒ አድራሻዎችን አስሉ.
  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;
    
  • ኮዱን የምናስቀምጥበት ፋይል እንፍጠር። ኮዱ በእጩዎች ሰንጠረዦች ውስጥ ይመዘገባል እና ለማረም ታሪክ ይይዛል።

    የአይፒ አድራሻዎችን ለመቅዳት የፋይል ኮድ

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

    የኮዱ ይዘት የጎብኝውን አይፒ አድራሻ ማግኘት እና በሠንጠረዥ ውስጥ መፃፍ ነው። አይፒው በሠንጠረዡ ውስጥ ካለ ፣ የ cnt መስኩ ይጨምራል (ለጣቢያው የጥያቄዎች ብዛት)

  • አሁን አስፈሪው ነገር... አሁን ለድርጊቴ ያቃጥሉኛል :)
    እያንዳንዱን ጥያቄ ወደ ጣቢያው ለመመዝገብ የፋይል ኮዱን ከዋናው የ WordPress ፋይል ጋር እናገናኘዋለን - wp-load.php. አዎ፣ የከርነል ፋይሉን እንለውጣለን እና የአለምአቀፍ ተለዋዋጭ $wpdb ቀድሞውኑ ካለ በኋላ በትክክል እንለውጣለን

ስለዚህ ፣ አሁን ይህ ወይም ያ IP አድራሻ በጠረጴዛችን ውስጥ ምን ያህል ጊዜ ምልክት እንደተደረገበት እና በቡና ኩባያ በ 5 ደቂቃ ውስጥ ምስሉን ለመረዳት አንድ ጊዜ እንመለከተዋለን ።

እምቅ "ክፉ" ቦቶችን እናሰላለን እና በአይፒ እንገድባቸዋለን

ከዚያ በቀላሉ "ጎጂ" አይፒን ይቅዱ, .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 ፋይል ውስጥ የማገድ ህጎችን ማስገባት ነው ።
# ጀምር_ራስ_ክድ_ዝርዝር እና # በራስ_ሰር_ክድ_ዝርዝር ይጨርሱ

አሁን "ጎጂ" አይፒዎች በራሳቸው ታግደዋል፣ እና .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

በዚህ ምክንያት ይህ ኮድ መሥራት ከጀመረ በኋላ ውጤቱን በአስተናጋጅ ፓነል ውስጥ ማየት ይችላሉ-

እምቅ "ክፉ" ቦቶችን እናሰላለን እና በአይፒ እንገድባቸዋለን

PS: ጽሑፉ የጸሐፊው ነው, ምንም እንኳን የተወሰነውን በድር ጣቢያዬ ላይ ባተምኩትም, በ Habre ላይ የበለጠ የተስፋፋ እትም አግኝቻለሁ.

ምንጭ: hab.com

አስተያየት ያክሉ