نحسب روبوتات "الشر" المحتملة ونمنعها عن طريق IP



يوم جيد في هذه المقالة ، سوف أخبرك كيف يمكن لمستخدمي الاستضافة العاديين التقاط عناوين IP التي تولد حمولة زائدة على الموقع ومن ثم منعهم باستخدام أدوات الاستضافة ، وسيكون هناك كود php "قليل" ، بضع لقطات.

إدخال البيانات:

  1. تم إنشاء موقع الويب على CMS WordPress
  2. Hosting Beget (هذا ليس إعلانًا ، لكن لقطات لوحة الإدارة ستكون موفر الاستضافة هذا)
  3. تم إطلاق موقع WordPress في مكان ما في بداية عام 2000 ويحتوي على عدد كبير من المقالات والمواد.
  4. PHP الإصدار 7.2
  5. الفسفور الابيض لديه أحدث نسخة
  6. لبعض الوقت الآن بدأ الموقع في إنشاء حمل كبير على MySQL وفقًا للاستضافة. كل يوم ، تجاوزت هذه القيمة 120 ٪ من القاعدة لكل حساب
  7. وفقا لياندكس. يزور الموقع المتري 100 إلى 200 شخص يوميًا

بادئ ذي بدء ، تم القيام به:

  1. يتم مسح قواعد البيانات من القمامة المتراكمة
  2. تم تعطيل المكونات الإضافية غير الضرورية ، وتتم إزالة مقاطع من التعليمات البرمجية القديمة

في الوقت نفسه ، أود أن ألفت الانتباه إلى خيارات التخزين المؤقت (الإضافات المؤقتة للتخزين المؤقت) ، وقمنا بعمل ملاحظات - لكن معدل التحميل بنسبة 120٪ من موقع واحد لم يتغير ويمكن أن ينمو فقط.

كيف بدا الحمل التقريبي على قواعد بيانات الاستضافة


في الجزء العلوي يوجد الموقع المعني ، أسفل المواقع الأخرى التي لها نفس cms ونفس حركة المرور ، ولكن تنشئ حملاً أقل.

تحليل

  • تم إجراء العديد من المحاولات مع خيارات للتخزين المؤقت للبيانات ، وتم إجراء ملاحظات لعدة أسابيع (الاستفادة من الاستضافة خلال هذا الوقت لم أكتب أبداً أنني سيئة للغاية وقطع الاتصال بي)
  • كان هناك تحليل والبحث عن الاستعلامات البطيئة ، ثم تم تغيير بنية قاعدة البيانات ونوع الجدول قليلاً
  • للتحليل ، تم استخدام AWStats المدمج في المقام الأول (بالمناسبة ، ساعد على حساب عنوان IP الأكثر شرًا من خلال حجم حركة المرور
  • المقياس - المقياس يعطي معلومات فقط عن الأشخاص ، وليس عن البوتات
  • كانت هناك محاولات لاستخدام المكونات الإضافية لـ WP ، والتي يمكنها تصفية ومنع الزوار حتى حسب بلد الموقع والمجموعات المختلفة
  • تبين أن هناك طريقة جذرية تمامًا تتمثل في إغلاق الموقع لمدة يوم باستخدام علامة "نحن في صيانة" - وقد تم ذلك أيضًا باستخدام المكون الإضافي الشهير. في هذه الحالة ، نتوقع انخفاض الحمل ، ولكن ليس إلى قيم يسارية ، نظرًا لأن أيديولوجية WP تعتمد على الخطافات وتبدأ الإضافات في نشاطها عند حدوث نوع من "hook" ، وقبل حدوث "hook" ، يمكن بالفعل إجراء استعلامات لقاعدة البيانات

فكرة

  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 (عدد الطلبات إلى الموقع)
  • الآن الأمر مخيف ... الآن سوف يحرقونني لأفعالي :)
    لتسجيل كل مكالمة إلى الموقع ، نقوم بتضمين رمز الملف في ملف WordPress الرئيسي - wp-load.php. نعم ، نقوم بتعديل ملف kernel على وجه التحديد بعد وجود المتغير العام $ 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 - ليس لديه حق الوصول إلى الموقع ولا يولد حمولة على قاعدة البيانات

لكن في كل مرة ، لا تعد النسخ بأيديك مهمة بارعة ، وبالإضافة إلى ذلك ، تم اعتبار الشفرة مستقلة

أضف ملفًا سيتم تنفيذه بواسطة 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

الآن يتم حظر الملكية الفكرية "الضارة" من تلقاء نفسها ، وملف .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 

نتيجة لذلك ، بعد بدء هذا الرمز ، يمكنك رؤية النتيجة في لوحة الاستضافة:



ملحوظة: هذه المادة هي حقوق طبع ونشر ، على الرغم من أنني نشرت جزءًا منها على موقعي ، ولكن على Habre تم الحصول على نسخة أكثر توسعًا.

Source: https://habr.com/ru/post/ar473030/


All Articles