موږ احتمالي "بد" بوټونه پیژنو او د IP لخوا یې بلاک کوو

موږ احتمالي "بد" بوټونه پیژنو او د IP لخوا یې بلاک کوو

ښه ورځ! په مقاله کې زه به تاسو ته ووایم چې څنګه د منظم کوربه توب کارونکي کولی شي IP پتې ونیسي چې په سایټ کې ډیر بار تولیدوي او بیا یې د کوربه توب وسیلو په کارولو سره بلاک کړي ، د پی ایچ پی کوډ "یو څه" به وي ، یو څو سکرین شاټونه.

د معلوماتو داخلول:

  1. ویب پاڼه په CMS WordPress کې جوړه شوې
  2. کوربه بیګټ (دا اعلان نه دی، مګر د اډمین پینل سکرین شاټونه به د دې ځانګړي کوربه چمتو کونکي څخه وي)
  3. د ورڈپریس سایټ د 2000 په پیل کې په کوم ځای کې پیل شوی و او ډیری مقالې او توکي لري
  4. د پی ایچ پی نسخه 7.2
  5. WP وروستۍ نسخه لري
  6. اوس د یو څه وخت لپاره، سایټ د کوربه کولو معلوماتو سره سم په MySQL کې د لوړ بار تولید پیل کړی. هره ورځ دا ارزښت د هر حساب د نورم 120٪ څخه ډیر شوی
  7. د Yandex په وینا. د میټریکا سایټ هره ورځ د 100-200 خلکو لخوا لیدل کیږي

تر ټولو لومړی، دا ترسره شو:

  1. د ډیټابیس میزونه د راټول شوي کثافاتو څخه پاک شوي
  2. غیر ضروري پلگ ان غیر فعال شوي، د زوړ کوډ برخې لرې شوي

په ورته وخت کې، زه غواړم ستاسو پام دې حقیقت ته واړوم چې د کیچ کولو اختیارونه (د کیچ کولو پلگ ان) هڅه شوي، مشاهدې شوي - مګر د یو سایټ څخه د 120٪ بار بدل شوی و او یوازې وده کولی شي.

د کوربه توب ډیټابیسونو کې نږدې بار څه ډول ښکاري

موږ احتمالي "بد" بوټونه پیژنو او د IP لخوا یې بلاک کوو
په پورتنۍ برخه کې د پوښتنې ځای دی، یوازې لاندې نور سایټونه دي چې ورته cms او نږدې ورته ټرافیک لري، مګر لږ بار رامنځته کوي.

شننه

  • د ډیټا کیچ کولو اختیارونو سره ډیری هڅې ترسره شوې ، لیدنې په څو اونیو کې ترسره شوې (له نېکه مرغه ، پدې وخت کې کوربه توب هیڅکله ما ته ندي لیکلي چې زه دومره خراب وم او به منحل شي)
  • د ورو پوښتنو لپاره تحلیل او لټون شتون درلود ، بیا د ډیټابیس جوړښت او د میز ډول یو څه بدل شو
  • د تحلیل لپاره، موږ په ابتدايي توګه جوړ شوي AWStats کارولي (په لاره کې، دا د ټرافیک حجم پراساس د بدترین IP پتې محاسبه کولو کې مرسته کړې.
  • میټریک - میټریک یوازې د خلکو په اړه معلومات وړاندې کوي، نه د بوټو په اړه
  • د WP لپاره د پلگ انونو کارولو هڅې شوي چې کولی شي لیدونکي فلټر او بلاک کړي حتی د موقعیت هیواد او مختلف ترکیبونو لخوا
  • په بشپړ ډول بنسټیز لاره د یوې ورځې لپاره سایټ بندول د یادښت سره "موږ د ساتنې لاندې یو" - دا هم د مشهور پلگ ان په کارولو سره ترسره شوی. په دې حالت کې، موږ تمه لرو چې بار به راټیټ شي، مګر صفر ارزښتونو ته نه، ځکه چې د WP نظریه د هکونو پر بنسټ والړ ده او پلګ ان خپل فعالیت پیل کوي کله چې "هک" واقع کیږي، او مخکې له دې چې "هک" واقع شي، ډیټابیس ته غوښتنې کولی شي. مخکې جوړ شوی

ایډا

  1. د IP پتې حساب کړئ چې په لنډ وخت کې ډیری غوښتنې کوي.
  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;
    
  • راځئ چې یو فایل جوړ کړو په کوم کې چې موږ به کوډ ځای په ځای کړو. کوډ به د بلاک کولو کاندید جدولونو کې ثبت کړي او د ډیبګ کولو تاریخ وساتي.

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

    د کوډ جوهر دا دی چې د لیدونکي IP پته ترلاسه کړئ او په میز کې یې ولیکئ. که چیرې ip دمخه په جدول کې وي ، نو د cnt ساحه به لوړه شي (سایټ ته د غوښتنو شمیر)

  • اوس ډارونکی شی ... اوس به دوی ما د خپلو اعمالو لپاره وسوځوي :)
    سایټ ته د هرې غوښتنې ثبتولو لپاره، موږ د فایل کوډ د اصلي ورڈپریس فایل سره وصل کوو - wp-load.php. هو، موږ د کرنل فایل بدلوو او دقیقا وروسته له دې چې نړیوال متغیر $wpdb لا دمخه شتون لري

نو، اوس موږ لیدلی شو چې دا یا هغه IP پته زموږ په میز کې څو ځله په نښه شوي او د کافي مګ سره موږ په هر 5 دقیقو کې یو ځل د عکس د پوهیدو لپاره هلته ګورو.

موږ احتمالي "بد" بوټونه پیژنو او د IP لخوا یې بلاک کوو

بیا په ساده ډول "ضررناک" IP کاپي کړئ ، د .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 فایل کې د بلاک کولو قواعد داخل کړي.
# start_auto_deny_list او # end_auto_deny_list

اوس "ضررناک" IPs پخپله بند شوي، او د .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

د پایلې په توګه، وروسته له دې چې دا کوډ کار پیل کړي، تاسو کولی شئ پایله د کوربه کولو پینل کې وګورئ:

موږ احتمالي "بد" بوټونه پیژنو او د IP لخوا یې بلاک کوو

PS: مواد د لیکوال دی، که څه هم ما د هغې یوه برخه په خپل ویب پاڼه کې خپره کړه، ما په هابر کې یوه پراخه نسخه ترلاسه کړه.

سرچینه: www.habr.com

Add a comment