Bidh sinn a’ comharrachadh bhotan “olc” a dh’ fhaodadh a bhith ann agus gan bacadh le IP

Bidh sinn a’ comharrachadh bhotan “olc” a dh’ fhaodadh a bhith ann agus gan bacadh le IP

Latha math! Anns an artaigil Innsidh mi dhut mar as urrainn do luchd-cleachdaidh aoigheachd cunbhalach seòlaidhean IP a ghlacadh a ghineas cus luchd air an làrach agus an uairsin casg a chuir orra le bhith a ’cleachdadh innealan aoigheachd, bidh“ beagan ”de chòd php, beagan dhealbhan-sgrìn.

Dàta cuir a-steach:

  1. Làrach-lìn air a chruthachadh air CMS WordPress
  2. Hosting Beget (chan e sanas a tha seo, ach bidh seallaidhean-sgrìn a’ phannal rianachd bhon t-solaraiche aoigheachd sònraichte seo)
  3. Chaidh làrach WordPress a chuir air bhog am badeigin tràth anns an 2000 agus tha àireamh mhòr de artaigilean agus stuthan ann
  4. Tionndadh PHP 7.2
  5. Tha an dreach as ùire aig WP
  6. Airson ùine a-nis, thòisich an làrach a ’gineadh luchd àrd air MySQL a rèir an dàta aoigheachd. Gach latha bha an luach seo nas àirde na 120% den àbhaist airson gach cunntas
  7. A rèir Yandex. Bidh 100-200 neach a’ tadhal air làrach Metrica gach latha

An toiseach, chaidh seo a dhèanamh:

  1. Chaidh clàran stòr-dàta a ghlanadh de sgudal cruinnichte
  2. Chaidh plugins neo-riatanach a chur à comas, chaidh earrannan de chòd seann-fhasanta a thoirt air falbh

Aig an aon àm, bu mhath leam d ’aire a tharraing chun fhìrinn gun deach roghainnean caching (plugins caching) fheuchainn, chaidh beachdan a thoirt seachad - ach bha an luchd de 120% bho aon làrach gun atharrachadh agus cha b’ urrainn dha ach fàs.

Cò ris a bha an luchd tuairmseach air stòran-dàta aoigheachd coltach

Bidh sinn a’ comharrachadh bhotan “olc” a dh’ fhaodadh a bhith ann agus gan bacadh le IP
Aig a’ mhullach tha an làrach sin, dìreach gu h-ìosal tha làraich eile aig a bheil na h-aon cms agus timcheall air an aon trafaic, ach a chruthaicheas nas lugha de luchd.

Mion-sgrùdadh

  • Chaidh mòran oidhirpean a dhèanamh le roghainnean tasgadh dàta, chaidh beachdan a dhèanamh thar grunn sheachdainean (gu fortanach, rè na h-ùine seo cha do sgrìobh an aoigheachd a-riamh thugam gu robh mi cho dona agus gum biodh mi air mo dhì-cheangal)
  • Bha mion-sgrùdadh agus rannsachadh airson ceistean slaodach, an uairsin chaidh structar an stòr-dàta agus an seòrsa clàr atharrachadh beagan
  • Airson mion-sgrùdadh, chleachd sinn gu sònraichte na AWStats a chaidh a thogail a-steach (co-dhiù, chuidich e le bhith ag obrachadh a-mach an seòladh IP as miosa stèidhichte air meud trafaic
  • Metric - chan eil am meatrach a’ toirt seachad fiosrachadh ach mu dhaoine, chan ann mu dheidhinn botaichean
  • Chaidh oidhirpean a dhèanamh gus plugins a chleachdadh airson WP as urrainn luchd-tadhail a shìoladh agus a bhacadh eadhon a rèir dùthaich an àite agus diofar choimeasgaidhean
  • B 'e dòigh gu tur radaigeach a bh' ann an làrach a dhùnadh airson latha leis an nota "Tha sinn fo chùram" - chaidh seo a dhèanamh cuideachd a 'cleachdadh am plugan ainmeil. Anns a ’chùis seo, tha sinn an dùil gun tuit an luchd, ach gun a bhith neoni, leis gu bheil ideòlas WP stèidhichte air dubhan agus plugins a’ tòiseachadh air an gnìomhachd nuair a thachras “dubhan”, agus mus tachair an “dubhan”, faodaidh iarrtasan chun stòr-dàta air a dhèanamh mu thràth

Idea

  1. Obraich a-mach seòlaidhean IP a nì tòrr iarrtasan ann an ùine ghoirid.
  2. Clàraich an àireamh de bhuaidhean air an làrach
  3. Cuir casg air ruigsinneachd air an làrach stèidhichte air an àireamh de bhuillean
  4. Cuir stad air le bhith a’ cleachdadh an inntrig “Dì-dhìol bho” san fhaidhle .htaccess
  5. Cha do bheachdaich mi air roghainnean eile, leithid iptables agus riaghailtean airson Nginx, oir tha mi a’ sgrìobhadh mu dheidhinn aoigheachd

Tha beachd air nochdadh, agus mar sin feumar a chuir an gnìomh, oir às aonais seo ...

  • A’ cruthachadh chlàran airson dàta a chruinneachadh
    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;
    
  • Cruthaichidh sinn faidhle anns an cuir sinn an còd. Clàraidh an còd anns na clàran bacaidh tagraiche agus cumaidh e eachdraidh airson dì-bhugachadh.

    Còd faidhle airson seòlaidhean IP a chlàradh

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

    Is e brìgh a’ chòd seòladh IP an neach-tadhail fhaighinn agus a sgrìobhadh a-steach do bhòrd. Ma tha an ip sa chlàr mu thràth, thèid an raon cnt àrdachadh (an àireamh de dh'iarrtasan air an làrach)

  • A-nis an rud eagallach ... A-nis loisgidh iad mi airson na rinn mi :)
    Gus gach iarrtas a chlàradh air an làrach, bidh sinn a 'ceangal còd an fhaidhle ris a' phrìomh fhaidhle WordPress - wp-load.php. Tha, bidh sinn ag atharrachadh am faidhle kernel agus dìreach às deidh an caochladair cruinne $ wpdb a bhith ann mu thràth

Mar sin, a-nis chì sinn dè cho tric ‘s a tha seo no an seòladh IP sin air a chomharrachadh anns a’ bhòrd againn agus le cupa cofaidh bidh sinn a ’coimhead an sin aon uair gach 5 mionaidean gus an dealbh a thuigsinn

Bidh sinn a’ comharrachadh bhotan “olc” a dh’ fhaodadh a bhith ann agus gan bacadh le IP

An uairsin dìreach dèan lethbhreac den IP “cronail”, fosgail am faidhle .htaccess agus cuir gu deireadh an fhaidhle e

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

Sin e, a-nis 94.242.55.248 - chan eil cothrom aige air an làrach agus chan eil e a’ gineadh luchd air an stòr-dàta

Ach a h-uile turas chan e obair fìor cheart a th’ ann a bhith a’ dèanamh copaidh le làimh mar seo, agus a bharrachd air an sin, bhathas an dùil gum biodh an còd neo-eisimeileach.

Nach cuir sinn faidhle a thèid a chuir gu bàs tro CRON gach 30 mionaid:

Còd faidhle ag atharrachadh .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)));

Tha an còd faidhle gu math sìmplidh agus prìomhadail agus is e am prìomh bheachd aige tagraichean a ghabhail airson bacadh agus cuir a-steach riaghailtean bacaidh anns an fhaidhle .htaccess eadar na beachdan
# start_auto_deny_list agus # end_auto_deny_list

A-nis tha IPan “cronail” air am bacadh leotha fhèin, agus tha am faidhle .htaccess a’ coimhead rudeigin mar seo:

# 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

Mar thoradh air an sin, às deidh don chòd seo tòiseachadh ag obair, chì thu an toradh anns a ’phannal aoigheachd:

Bidh sinn a’ comharrachadh bhotan “olc” a dh’ fhaodadh a bhith ann agus gan bacadh le IP

PS: Is ann leis an ùghdar a tha an stuth, ged a dh’ fhoillsich mi pàirt dheth air an làrach-lìn agam, fhuair mi dreach nas leudaichte air Habre.

Source: www.habr.com

Cuir beachd ann