ನಾವು ಸಂಭಾವ್ಯ "ದುಷ್ಟ" ಬಾಟ್‌ಗಳನ್ನು ಗುರುತಿಸುತ್ತೇವೆ ಮತ್ತು ಅವುಗಳನ್ನು ಐಪಿ ಮೂಲಕ ನಿರ್ಬಂಧಿಸುತ್ತೇವೆ

ನಾವು ಸಂಭಾವ್ಯ "ದುಷ್ಟ" ಬಾಟ್‌ಗಳನ್ನು ಗುರುತಿಸುತ್ತೇವೆ ಮತ್ತು ಅವುಗಳನ್ನು ಐಪಿ ಮೂಲಕ ನಿರ್ಬಂಧಿಸುತ್ತೇವೆ

ಶುಭ ದಿನ! ಸಾಮಾನ್ಯ ಹೋಸ್ಟಿಂಗ್‌ನ ಬಳಕೆದಾರರು ಸೈಟ್‌ನಲ್ಲಿ ಅತಿಯಾದ ಲೋಡ್ ಅನ್ನು ಉತ್ಪಾದಿಸುವ ಐಪಿ ವಿಳಾಸಗಳನ್ನು ಹೇಗೆ ಹಿಡಿಯಬಹುದು ಮತ್ತು ನಂತರ ಹೋಸ್ಟಿಂಗ್ ಪರಿಕರಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಅವುಗಳನ್ನು ನಿರ್ಬಂಧಿಸಬಹುದು ಎಂದು ಲೇಖನದಲ್ಲಿ ನಾನು ನಿಮಗೆ ಹೇಳುತ್ತೇನೆ, ಪಿಎಚ್‌ಪಿ ಕೋಡ್‌ನ “ಸ್ವಲ್ಪ”, ಕೆಲವು ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳು ಇರುತ್ತವೆ.

ಇನ್‌ಪುಟ್ ಡೇಟಾ:

  1. CMS WordPress ನಲ್ಲಿ ವೆಬ್‌ಸೈಟ್ ರಚಿಸಲಾಗಿದೆ
  2. ಹೋಸ್ಟಿಂಗ್ ಬೆಗೆಟ್ (ಇದು ಜಾಹೀರಾತಲ್ಲ, ಆದರೆ ನಿರ್ವಾಹಕ ಫಲಕದ ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳು ಈ ನಿರ್ದಿಷ್ಟ ಹೋಸ್ಟಿಂಗ್ ಪೂರೈಕೆದಾರರಿಂದ ಆಗಿರುತ್ತದೆ)
  3. ವರ್ಡ್ಪ್ರೆಸ್ ಸೈಟ್ ಅನ್ನು 2000 ರ ಆರಂಭದಲ್ಲಿ ಎಲ್ಲೋ ಪ್ರಾರಂಭಿಸಲಾಯಿತು ಮತ್ತು ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆಯ ಲೇಖನಗಳು ಮತ್ತು ವಸ್ತುಗಳನ್ನು ಹೊಂದಿದೆ
  4. PHP ಆವೃತ್ತಿ 7.2
  5. WP ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಯನ್ನು ಹೊಂದಿದೆ
  6. ಸ್ವಲ್ಪ ಸಮಯದವರೆಗೆ, ಹೋಸ್ಟಿಂಗ್ ಡೇಟಾದ ಪ್ರಕಾರ ಸೈಟ್ MySQL ನಲ್ಲಿ ಹೆಚ್ಚಿನ ಲೋಡ್ ಅನ್ನು ಉತ್ಪಾದಿಸಲು ಪ್ರಾರಂಭಿಸಿತು. ಪ್ರತಿದಿನ ಈ ಮೌಲ್ಯವು ಪ್ರತಿ ಖಾತೆಗೆ ರೂಢಿಯ 120% ಅನ್ನು ಮೀರಿದೆ
  7. ಯಾಂಡೆಕ್ಸ್ ಪ್ರಕಾರ. ಮೆಟ್ರಿಕಾ ಸೈಟ್‌ಗೆ ದಿನಕ್ಕೆ 100-200 ಜನರು ಭೇಟಿ ನೀಡುತ್ತಾರೆ

ಮೊದಲನೆಯದಾಗಿ, ಇದನ್ನು ಮಾಡಲಾಯಿತು:

  1. ಸಂಗ್ರಹವಾದ ಕಸದಿಂದ ಡೇಟಾಬೇಸ್ ಟೇಬಲ್‌ಗಳನ್ನು ತೆರವುಗೊಳಿಸಲಾಗಿದೆ
  2. ಅನಗತ್ಯ ಪ್ಲಗಿನ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ, ಹಳೆಯ ಕೋಡ್‌ನ ವಿಭಾಗಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ

ಅದೇ ಸಮಯದಲ್ಲಿ, ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವ ಆಯ್ಕೆಗಳನ್ನು (ಕ್ಯಾಶಿಂಗ್ ಪ್ಲಗಿನ್‌ಗಳು) ಪ್ರಯತ್ನಿಸಲಾಗಿದೆ, ಅವಲೋಕನಗಳನ್ನು ಮಾಡಲಾಗಿದೆ ಎಂಬ ಅಂಶಕ್ಕೆ ನಿಮ್ಮ ಗಮನವನ್ನು ಸೆಳೆಯಲು ನಾನು ಬಯಸುತ್ತೇನೆ - ಆದರೆ ಒಂದು ಸೈಟ್‌ನಿಂದ 120% ನಷ್ಟು ಲೋಡ್ ಬದಲಾಗದೆ ಮತ್ತು ಬೆಳೆಯಬಹುದು.

ಹೋಸ್ಟಿಂಗ್ ಡೇಟಾಬೇಸ್‌ಗಳ ಮೇಲಿನ ಅಂದಾಜು ಲೋಡ್ ಹೇಗಿದೆ

ನಾವು ಸಂಭಾವ್ಯ "ದುಷ್ಟ" ಬಾಟ್‌ಗಳನ್ನು ಗುರುತಿಸುತ್ತೇವೆ ಮತ್ತು ಅವುಗಳನ್ನು ಐಪಿ ಮೂಲಕ ನಿರ್ಬಂಧಿಸುತ್ತೇವೆ
ಮೇಲ್ಭಾಗದಲ್ಲಿ ಪ್ರಶ್ನಾರ್ಹ ಸೈಟ್ ಆಗಿದೆ, ಸ್ವಲ್ಪ ಕೆಳಗೆ ಅದೇ ಸೆಂ ಮತ್ತು ಸರಿಸುಮಾರು ಒಂದೇ ಟ್ರಾಫಿಕ್ ಹೊಂದಿರುವ ಇತರ ಸೈಟ್‌ಗಳು, ಆದರೆ ಕಡಿಮೆ ಲೋಡ್ ಅನ್ನು ರಚಿಸುತ್ತವೆ.

ಅನಾಲಿಜ

  • ಡೇಟಾ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವ ಆಯ್ಕೆಗಳೊಂದಿಗೆ ಅನೇಕ ಪ್ರಯತ್ನಗಳನ್ನು ಮಾಡಲಾಯಿತು, ಹಲವಾರು ವಾರಗಳವರೆಗೆ ಅವಲೋಕನಗಳನ್ನು ನಡೆಸಲಾಯಿತು (ಅದೃಷ್ಟವಶಾತ್, ಈ ಸಮಯದಲ್ಲಿ ಹೋಸ್ಟಿಂಗ್ ನನಗೆ ಎಂದಿಗೂ ಬರೆಯಲಿಲ್ಲ, ನಾನು ತುಂಬಾ ಕೆಟ್ಟವನು ಮತ್ತು ಸಂಪರ್ಕ ಕಡಿತಗೊಳ್ಳುತ್ತೇನೆ)
  • ನಿಧಾನ ಪ್ರಶ್ನೆಗಳಿಗಾಗಿ ವಿಶ್ಲೇಷಣೆ ಮತ್ತು ಹುಡುಕಾಟವಿದೆ, ನಂತರ ಡೇಟಾಬೇಸ್ ರಚನೆ ಮತ್ತು ಟೇಬಲ್ ಪ್ರಕಾರವನ್ನು ಸ್ವಲ್ಪ ಬದಲಾಯಿಸಲಾಗಿದೆ
  • ವಿಶ್ಲೇಷಣೆಗಾಗಿ, ನಾವು ಪ್ರಾಥಮಿಕವಾಗಿ ಅಂತರ್ನಿರ್ಮಿತ 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 ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದ್ದ ನಂತರ ನಿಖರವಾಗಿ

ಆದ್ದರಿಂದ, ನಮ್ಮ ಟೇಬಲ್‌ನಲ್ಲಿ ಈ ಅಥವಾ ಆ ಐಪಿ ವಿಳಾಸವನ್ನು ಎಷ್ಟು ಬಾರಿ ಗುರುತಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ಈಗ ನಾವು ನೋಡಬಹುದು ಮತ್ತು ಚಿತ್ರವನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ನಾವು ಪ್ರತಿ 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 ಫೈಲ್‌ನಲ್ಲಿ ನಿರ್ಬಂಧಿಸಲು ಮತ್ತು ನಿರ್ಬಂಧಿಸುವ ನಿಯಮಗಳನ್ನು ನಮೂದಿಸಲು ಅಭ್ಯರ್ಥಿಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುವುದು ಇದರ ಮುಖ್ಯ ಆಲೋಚನೆಯಾಗಿದೆ.
# ಪ್ರಾರಂಭ_ಸ್ವಯಂ_ನಿರಾಕರಣೆ_ಪಟ್ಟಿ ಮತ್ತು # ಅಂತ್ಯ_ಸ್ವಯಂ_ನಿರಾಕರಣೆ_ಪಟ್ಟಿ

ಈಗ "ಹಾನಿಕಾರಕ" IP ಗಳನ್ನು ಸ್ವತಃ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ ಮತ್ತು .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

ಪರಿಣಾಮವಾಗಿ, ಈ ಕೋಡ್ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಪ್ರಾರಂಭಿಸಿದ ನಂತರ, ನೀವು ಹೋಸ್ಟಿಂಗ್ ಪ್ಯಾನೆಲ್‌ನಲ್ಲಿ ಫಲಿತಾಂಶವನ್ನು ನೋಡಬಹುದು:

ನಾವು ಸಂಭಾವ್ಯ "ದುಷ್ಟ" ಬಾಟ್‌ಗಳನ್ನು ಗುರುತಿಸುತ್ತೇವೆ ಮತ್ತು ಅವುಗಳನ್ನು ಐಪಿ ಮೂಲಕ ನಿರ್ಬಂಧಿಸುತ್ತೇವೆ

PS: ವಸ್ತುವು ಲೇಖಕರದ್ದು, ನಾನು ಅದರ ಭಾಗವನ್ನು ನನ್ನ ವೆಬ್‌ಸೈಟ್‌ನಲ್ಲಿ ಪ್ರಕಟಿಸಿದ್ದರೂ, ನಾನು ಹಬ್ರೆಯಲ್ಲಿ ಹೆಚ್ಚು ವಿಸ್ತೃತ ಆವೃತ್ತಿಯನ್ನು ಪಡೆದುಕೊಂಡಿದ್ದೇನೆ.

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ