Sichonga iibhothi ezinokuthi "zibi" kwaye zibathintele nge-IP

Sichonga iibhothi ezinokuthi "zibi" kwaye zibathintele nge-IP

Mholweni emini nje! Kwinqaku ndiza kukuxelela indlela abasebenzisi ababamba ngayo rhoqo abanokuthi babambe iidilesi ze-IP ezivelisa umthwalo ogqithisileyo kwisayithi kwaye emva koko bavimbele usebenzisa izixhobo zokubamba, kuya kuba "incinci" yekhowudi yephp, izikrini ezimbalwa.

Igalelo ledatha:

  1. Сайт созданный на CMS WordPress
  2. Ukusingatha I-Beget (le ayisiyontengiso, kodwa izikrini zolawulo ziya kuvela kulo mboneleli we-hostage)
  3. WordPress сайт запущен где то в начале 2000 и имеет большое количество статей и материалов
  4. Uguqulelo lwe-PHP 7.2
  5. I-WP inenguqulelo yamva nje
  6. Ngexesha elithile ngoku, isayithi yaqala ukuvelisa umthwalo ophezulu kwi-MySQL ngokwedatha yokubamba. Yonke imihla eli xabiso lidlula i-120% yesiqhelo kwi-akhawunti nganye
  7. Ngokutsho kweYandex. Indawo yeMetrica ityelelwa ngabantu abayi-100-200 ngosuku

Okokuqala, oku kwenziwa:

  1. Iitheyibhile zesiseko sedatha zacocwa inkunkuma eqokelelweyo
  2. Iiplagi ezingeyomfuneko zacinywa, amacandelo ekhowudi ephelelwe lixesha asusiwe

Ngexesha elifanayo, ndingathanda ukutsala ingqalelo yakho kwinto yokuba iinketho ze-caching (i-caching plugins) zazanywa, ukuqwalaselwa kwenziwa - kodwa umthwalo we-120% ukusuka kwindawo enye wawungatshintshi kwaye unokukhula kuphela.

Ubunjani umthwalo oqikelelweyo kugcino-lwazi lokubamba ujongeka njani

Sichonga iibhothi ezinokuthi "zibi" kwaye zibathintele nge-IP
Phezulu yindawo ekuthethwa ngayo, apha ngezantsi kukho ezinye iisayithi ezinee-cms ezifanayo kwaye malunga netrafikhi efanayo, kodwa yenza umthwalo omncinci.

Uhlalutyo

  • Iinzame ezininzi zenziwa ngokukhethwa kwedatha yokugcina idatha, uqwalaselo lwenziwa kwiiveki ezininzi (ngethamsanqa, ngeli xesha ukusingathwa akuzange kundibhalele ukuba ndimbi kakhulu kwaye ndiza kukhutshwa)
  • Kwakukho uhlalutyo kunye nokukhangela imibuzo ecothayo, emva koko ubume besiseko sedatha kunye nohlobo lwetafile zatshintshwa kancinci
  • Ukuhlalutya, sisebenzise ngokukodwa i-AWStats eyakhelwe ngaphakathi (ngendlela, incede ukubala idilesi ye-IP embi kakhulu ngokusekelwe kumthamo wezithuthi.
  • I-Metric - i-metric inikezela ngolwazi malunga nabantu kuphela, kungekhona malunga ne-bots
  • Kukho iinzame zokusebenzisa iiplagi zeWP ezinokuthi zihluze kwaye zithintele iindwendwe nakwilizwe lendawo kunye neendidi ezahlukeneyo.
  • Indlela egqibeleleyo yajika yaba kukuvala indawo yosuku kunye nenqaku elithi "Siphantsi kogcino" - oku kwenziwa kusetyenziswa iplagin eyaziwayo. Kule meko, silindele ukuba umthwalo wehle, kodwa ungabikho kwixabiso le-zero, ekubeni ingcamango yeWP isekelwe kwiikhonkco kunye neeplagizi ziqala umsebenzi wazo xa "ikhonkco" lenzeka, kwaye ngaphambi kokuba "i-hook" yenzeke, izicelo kwi-database ziyakwazi. sele yenziwe

Umbono

  1. Bala iidilesi ze-IP ezenza izicelo ezininzi ngexesha elifutshane.
  2. Rekhoda inani lokubethelwa kwindawo
  3. Vimba ukufikelela kwisiza ngokusekwe kwinani lokubetha
  4. Vimba usebenzisa "Yenqaba ukusuka" ukungena kwifayile ye.htaccess
  5. Andizange ndiqwalasele ezinye iinketho, njenge-iptables kunye nemithetho ye-Nginx, kuba ndibhala malunga nokusingatha

Kuye kwavela umbono, ngoko ke kufuneka uphunyezwe, njengoko ngaphandle koku ...

  • Ukwenza iitheyibhile ukuqokelela idatha
    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;
    
  • Masenze ifayile apho siya kubeka khona ikhowudi. Ikhowudi iya kurekhoda kwiitheyibhile zomgqatswa ezibhlokayo kwaye igcine imbali yokulungisa iimpazamo.

    Ikhowudi yefayile yokurekhoda iidilesi ze-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);
    
    

    Undoqo wekhowudi kukufumana idilesi ye-IP yendwendwe kwaye uyibhale kwitafile. Ukuba i-ip sele ikwitafile, indawo ye-cnt iya kwandiswa (inani lezicelo kwisiza)

  • Ngoku into eyoyikisayo... Ngoku baya kunditshisa ngezenzo zam :)
    Что бы записывать каждое обращение сайту, подключаем код файла в главный файл WordPress — wp-load.php. Да именно изменяем файл ядра и именно после того как уже существует глобальная переменная $wpdb

Ke, ngoku sinokubona ukuba le okanye idilesi ye-IP iphawulwe kangaphi kwitafile yethu kwaye ngemagi yekofu sijonga apho kanye ngemizuzu emi-5 ukuqonda umfanekiso.

Sichonga iibhothi ezinokuthi "zibi" kwaye zibathintele nge-IP

Emva koko khuphela ngokulula i-IP "eyingozi", vula ifayile ye.htaccess kwaye uyifake ekupheleni kwefayile.

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

Yiyo, ngoku i-94.242.55.248 - ayinakho ukufikelela kwisiza kwaye ayivelisi umthwalo kwisiseko sedatha.

Kodwa ngalo lonke ixesha ukukopa ngesandla ngolu hlobo ayingomsebenzi olungileyo kakhulu, kwaye ngaphandle koko, ikhowudi yayijonge ukuzimela.

Masiyongeze ifayile eya kusetyenziswa nge-CRON rhoqo ngemizuzu engama-30:

Ikhowudi yefayile yokuguqula .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)));

Ikhowudi yefayile ilula kwaye iyinto yokuqala kwaye ingcamango yayo ephambili kukuthatha abaviwa ukubhloka kunye nokufaka imithetho ethintela kwifayile ye.htaccess phakathi kwezimvo.
# qala_uluhlu_lokukhanyela_okuzenzekelayo kwaye # phelisa_uluhlu_lokukhanyela_okuzenzekelayo

Ngoku ii-IP "ezinobungozi" zivaliwe ngokwazo, kwaye ifayile ye.htaccess ibonakala ngolu hlobo:

# 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

Ngenxa yoko, emva kokuba le khowudi iqale ukusebenza, unokubona umphumo kwiphaneli yokubamba:

Sichonga iibhothi ezinokuthi "zibi" kwaye zibathintele nge-IP

I-PS: Izinto eziphathekayo zezombhali, nangona ndipapashe inxalenye yayo kwiwebhusayithi yam, ndifumene inguqulelo eyandisiweyo kwiHabre.

umthombo: www.habr.com

Thenga ukusingathwa okuthembekileyo kwiindawo ezinokhuseleko lweDDoS, iiseva zeVPS VDS 🔥 Thenga ukusingathwa kwewebhusayithi okuthembekileyo ngokhuseleko lwe-DDoS, iiseva zeVPS VDS | ProHoster