ہم ممکنہ "برائی" بوٹس کی شناخت کرتے ہیں اور انہیں IP کے ذریعے بلاک کرتے ہیں۔

ہم ممکنہ "برائی" بوٹس کی شناخت کرتے ہیں اور انہیں IP کے ذریعے بلاک کرتے ہیں۔

اچھا دن! آرٹیکل میں میں آپ کو بتاؤں گا کہ ریگولر ہوسٹنگ کے صارفین کس طرح IP ایڈریس پکڑ سکتے ہیں جو سائٹ پر ضرورت سے زیادہ بوجھ پیدا کرتے ہیں اور پھر ہوسٹنگ ٹولز کا استعمال کرتے ہوئے انہیں بلاک کر دیتے ہیں، وہاں php کوڈ کا "تھوڑا سا" ہوگا، چند اسکرین شاٹس۔

ان پٹ ڈیٹا:

  1. سی ایم ایس ورڈپریس پر بنائی گئی ویب سائٹ
  2. Hosting Beget (یہ کوئی اشتہار نہیں ہے، لیکن ایڈمن پینل کے اسکرین شاٹس اس مخصوص ہوسٹنگ فراہم کنندہ کے ہوں گے)
  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 فائل میں "Deny from" انٹری کا استعمال کرتے ہوئے بلاک کریں۔
  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 پہلے سے ہی ٹیبل میں ہے، cnt فیلڈ میں اضافہ کیا جائے گا (سائٹ پر درخواستوں کی تعداد)

  • اب ڈراؤنے والی بات... اب وہ مجھے میرے اعمال کی وجہ سے جلا دیں گے :)
    سائٹ پر ہر درخواست کو ریکارڈ کرنے کے لیے، ہم فائل کوڈ کو مرکزی ورڈپریس فائل - wp-load.php سے جوڑتے ہیں۔ ہاں، ہم کرنل فائل کو تبدیل کرتے ہیں اور عالمی متغیر $wpdb کے پہلے سے موجود ہونے کے بعد

لہذا، اب ہم دیکھ سکتے ہیں کہ یہ یا وہ IP ایڈریس ہماری میز میں کتنی بار نشان زد ہوتا ہے اور کافی کے ایک مگ کے ساتھ ہم تصویر کو سمجھنے کے لیے ہر 5 منٹ میں ایک بار وہاں دیکھتے ہیں۔

ہم ممکنہ "برائی" بوٹس کی شناخت کرتے ہیں اور انہیں 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: مواد مصنف کا ہے، اگرچہ میں نے اس کا کچھ حصہ اپنی ویب سائٹ پر شائع کیا ہے، لیکن مجھے Habre پر ایک وسیع ورژن ملا ہے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں