اسان امڪاني "برائي" بوٽن جي سڃاڻپ ڪندا آهيون ۽ انهن کي IP ذريعي بلاڪ ڪندا آهيون

اسان امڪاني "برائي" بوٽن جي سڃاڻپ ڪندا آهيون ۽ انهن کي IP ذريعي بلاڪ ڪندا آهيون

توهان جو ڏينهن سٺو گذري! آرٽيڪل ۾ آئون توهان کي ٻڌايان ٿو ته ڪيئن باقاعده هوسٽنگ جا استعمال ڪندڙ IP پتي کي پڪڙي سگهن ٿا جيڪي سائيٽ تي تمام گهڻو لوڊ پيدا ڪن ٿا ۽ پوء انهن کي ميزباني جا اوزار استعمال ڪندي بلاڪ ڪن ٿا، اتي php ڪوڊ جو "ٿورو سا" هوندو، ڪجهه اسڪرين شاٽ.

ان پٽ ڊيٽا:

  1. ويب سائيٽ CMS WordPress تي ٺاهي وئي
  2. Hosting Beget (هي ڪو اشتهار نه آهي، پر ايڊمن پينل جا اسڪرين شاٽ هن خاص هوسٽنگ فراهم ڪندڙ کان هوندا)
  3. ورڈپریس سائيٽ 2000 جي شروعات ۾ ڪٿي شروع ڪئي وئي ۽ مضمونن ۽ مواد جو وڏو تعداد آهي
  4. PHP نسخو 7.2
  5. WP جو جديد نسخو آھي
  6. ھاڻي ڪجھ وقت لاءِ، سائيٽ ھسٽنگ ڊيٽا جي مطابق MySQL تي ھڪڙو وڏو لوڊ پيدا ڪرڻ شروع ڪيو. هر روز اهو قدر وڌي ويو 120٪ في حساب جي معمول جي
  7. جي مطابق Yandex. ميٽريڪا سائيٽ جو دورو ڪيو ويو آهي 100-200 ماڻهو في ڏينهن

سڀ کان پهريان، هي ڪيو ويو:

  1. ڊيٽابيس جي جدولن کي گڏ ٿيل گندگي مان صاف ڪيو ويو
  2. غير ضروري پلگ ان بند ڪيا ويا، پراڻو ڪوڊ جا حصا ختم ڪيا ويا

ساڳئي وقت، مان توهان جو ڌيان ان حقيقت ڏانهن ڇڪائڻ چاهيان ٿو ته ڪيشنگ آپشنز (ڪيشنگ پلگ ان) جي ڪوشش ڪئي وئي، مشاهدو ڪيو ويو - پر هڪ سائيٽ کان 120٪ جو لوڊ اڻڄاتل هو ۽ صرف وڌي سگهي ٿو.

هوسٽنگ ڊيٽابيس تي لڳ ڀڳ لوڊ ڇا نظر آيو

اسان امڪاني "برائي" بوٽن جي سڃاڻپ ڪندا آهيون ۽ انهن کي IP ذريعي بلاڪ ڪندا آهيون
مٿي تي سوال ۾ سائيٽ آهي، صرف هيٺيون ٻيون سائيٽون آهن جن وٽ ساڳيون سي ايم ايس ۽ لڳ ڀڳ ساڳي ٽرئفڪ آهي، پر گهٽ لوڊ ٺاهي ٿي.

تجزيو

  • ڊيٽا ڪيشنگ جي اختيارن سان ڪيتريون ئي ڪوششون ڪيون ويون، ڪيترن ئي هفتن کان مشاهدو ڪيو ويو (خوش قسمتي سان، هن وقت دوران هوسٽنگ مون کي ڪڏهن به نه لکيو ته مان تمام خراب آهيان ۽ ڊسڪ ڪيو ويندو)
  • اتي هڪ تجزيو ۽ سست سوالن جي ڳولا هئي، پوء ڊيٽابيس جي جوڙجڪ ۽ ٽيبل جو قسم ٿورو تبديل ڪيو ويو
  • تجزيي لاءِ، اسان بنيادي طور استعمال ڪيو بلٽ ان 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 اڳ ۾ ئي ٽيبل ۾ آهي، سي اين ٽي فيلڊ وڌايو ويندو (سائيٽ ڏانهن درخواستن جو تعداد)

  • هاڻي خوفناڪ شيءِ ... هاڻي اهي مون کي منهنجي عملن لاءِ ساڙي ڇڏيندا :)
    سائيٽ تي هر درخواست کي رڪارڊ ڪرڻ لاء، اسان فائل ڪوڊ کي مکيه ورڈپریس فائل سان ڳنڍيندا آهيون - 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 - سائيٽ تائين رسائي نه آھي ۽ ڊيٽابيس تي لوڊ پيدا نٿو ڪري

پر هر دفعي هن طرح هٿ سان نقل ڪرڻ ڪو تمام سٺو ڪم نه آهي، ۽ ان کان علاوه، ڪوڊ خودمختار ٿيڻ جو ارادو ڪيو ويو آهي.

اچو ته هڪ فائل شامل ڪريو جيڪا CRON ذريعي هر 30 منٽن تي عمل ڪئي ويندي:

فائل ڪوڊ تبديل ڪندي .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 ذريعي بلاڪ ڪندا آهيون

پي ايس: مواد ليکڪ جو آهي، جيتوڻيڪ مون ان جو حصو پنهنجي ويب سائيٽ تي شايع ڪيو، مون کي هڪ وڌيڪ وڌايو ويو نسخو حبري تي.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو