์ž ์žฌ์ ์ธ "์‚ฌ์•…ํ•œ" ๋ด‡์„ ์‹๋ณ„ํ•˜๊ณ  IP๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ž ์žฌ์ ์ธ "์‚ฌ์•…ํ•œ" ๋ด‡์„ ์‹๋ณ„ํ•˜๊ณ  IP๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”! ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ผ๋ฐ˜ ํ˜ธ์ŠคํŒ… ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์ดํŠธ์— ๊ณผ๋„ํ•œ ๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” IP ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ํ˜ธ์ŠคํŒ… ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. "์•ฝ๊ฐ„์˜" PHP ์ฝ”๋“œ์™€ ๋ช‡ ๊ฐ€์ง€ ์Šคํฌ๋ฆฐ์ƒท์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž…๋ ฅ ๋ฐ์ดํ„ฐ:

  1. CMS WordPress์—์„œ ์ƒ์„ฑ๋œ ์›น์‚ฌ์ดํŠธ
  2. Hosting Beget(๊ด‘๊ณ ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ด€๋ฆฌ์ž ํŒจ๋„ ์Šคํฌ๋ฆฐ์ƒท์€ ์ด ํŠน์ • ํ˜ธ์ŠคํŒ… ์ œ๊ณต์—…์ฒด์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž„)
  3. WordPress ์‚ฌ์ดํŠธ๋Š” 2000๋…„ ์ดˆ๋ฐ˜์ฏค์— ์‹œ์ž‘๋˜์—ˆ์œผ๋ฉฐ ์ˆ˜๋งŽ์€ ๊ธฐ์‚ฌ์™€ ์ž๋ฃŒ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  4. PHP ๋ฒ„์ „ 7.2
  5. WP๋Š” ์ตœ์‹  ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
  6. ํ•œ๋™์•ˆ ์‚ฌ์ดํŠธ๋Š” ํ˜ธ์ŠคํŒ… ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ MySQL์— ๋†’์€ ๋ถ€ํ•˜๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค์ผ ์ด ๊ฐ’์€ ๊ณ„์ •๋‹น ๊ธฐ์ค€์˜ 120%๋ฅผ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.
  7. Yandex์— ๋”ฐ๋ฅด๋ฉด. Metrica ์‚ฌ์ดํŠธ๋Š” ํ•˜๋ฃจ 100~200๋ช…์ด ๋ฐฉ๋ฌธํ•ฉ๋‹ˆ๋‹ค.

์šฐ์„ , ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ์Œ“์ธ ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ์ง€์›Œ์กŒ์Šต๋‹ˆ๋‹ค.
  2. ๋ถˆํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋น„ํ™œ์„ฑํ™”๋˜๊ณ  ์˜ค๋ž˜๋œ ์ฝ”๋“œ ์„น์…˜์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋™์‹œ์— ์บ์‹ฑ ์˜ต์…˜(์บ์‹ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ)์„ ์‹œ๋„ํ•˜๊ณ  ๊ด€์ฐฐํ–ˆ์ง€๋งŒ ํ•œ ์‚ฌ์ดํŠธ์˜ 120% ๋กœ๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ฆ๊ฐ€ํ•  ์ˆ˜๋ฐ–์— ์—†์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ์ฃผ๋ชฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŒ… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋Œ€๋žต์ ์ธ ๋กœ๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ?

์ž ์žฌ์ ์ธ "์‚ฌ์•…ํ•œ" ๋ด‡์„ ์‹๋ณ„ํ•˜๊ณ  IP๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
๋งจ ์œ„์—๋Š” ๋ฌธ์ œ์˜ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๊ณ  ๋ฐ”๋กœ ์•„๋ž˜์—๋Š” ๋™์ผํ•œ cms์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋ถ€ํ•˜๊ฐ€ ์ ์€ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„์„

  • ๋ฐ์ดํ„ฐ ์บ์‹ฑ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŽ์€ ์‹œ๋„๊ฐ€ ์žˆ์—ˆ๊ณ  ๋ช‡ ์ฃผ์— ๊ฑธ์ณ ๊ด€์ฐฐ์ด ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (๋‹คํ–‰ํžˆ๋„ ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ ํ˜ธ์ŠคํŒ…์—์„œ๋Š” ๋‚ด๊ฐ€ ๋„ˆ๋ฌด ๋‚˜๋น ์„œ ์—ฐ๊ฒฐ์ด ๋Š์–ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ๋‚˜์—๊ฒŒ ํŽธ์ง€๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.)
  • ๋Š๋ฆฐ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ถ„์„ ๋ฐ ๊ฒ€์ƒ‰์ด ์žˆ์—ˆ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ์™€ ํ…Œ์ด๋ธ” ์œ ํ˜•์ด ์•ฝ๊ฐ„ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ถ„์„์„ ์œ„ํ•ด ๋‚ด์žฅ๋œ AWStats๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฐ๋ฐ ํŠธ๋ž˜ํ”ฝ๋Ÿ‰์„ ๊ธฐ์ค€์œผ๋กœ ์ตœ์•…์˜ IP ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค)
  • ์ธก์ •ํ•ญ๋ชฉ - ์ธก์ •ํ•ญ๋ชฉ์€ ๋ด‡์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์•„๋‹Œ ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„์น˜ ๊ตญ๊ฐ€๋ณ„, ๋‹ค์–‘ํ•œ ์กฐํ•ฉ๋ณ„๋กœ๋„ ๋ฐฉ๋ฌธ์ž๋ฅผ ํ•„ํ„ฐ๋ง ๋ฐ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” WP์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์™„์ „ํžˆ ๊ธ‰์ง„์ ์ธ ๋ฐฉ๋ฒ•์€ "์šฐ๋ฆฌ๋Š” ์œ ์ง€ ๊ด€๋ฆฌ ์ค‘์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”๋ชจ์™€ ํ•จ๊ป˜ ํ•˜๋ฃจ ๋™์•ˆ ์‚ฌ์ดํŠธ๋ฅผ ๋‹ซ๋Š” ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…๋„ ์œ ๋ช…ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋กœ๋“œ๊ฐ€ ๊ฐ์†Œํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ WP ์ด๋ฐ์˜ฌ๋กœ๊ธฐ๋Š” ํ›„ํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์€ "ํ›„ํฌ"๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํ™œ๋™์„ ์‹œ์ž‘ํ•˜๊ณ  "ํ›„ํฌ"๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— 0 ๊ฐ’์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ฏธ ๋งŒ๋“ค์–ด์กŒ์–ด

์ƒ๊ฐ

  1. ์งง์€ ์‹œ๊ฐ„์— ๋งŽ์€ ์š”์ฒญ์„ ํ•˜๋Š” IP ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์ดํŠธ ์กฐํšŒ์ˆ˜ ๊ธฐ๋ก
  3. ์กฐํšŒ์ˆ˜์— ๋”ฐ๋ผ ์‚ฌ์ดํŠธ ์ ‘์†์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  4. .htaccess ํŒŒ์ผ์˜ "๋‹ค์Œ์—์„œ ๊ฑฐ๋ถ€" ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐจ๋‹จ
  5. ํ˜ธ์ŠคํŒ…์— ๊ด€ํ•ด ๊ธ€์„ ์“ฐ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Nginx์— ๋Œ€ํ•œ iptables ๋ฐ ๊ทœ์น™๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์˜ต์…˜์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์•„์ด๋””์–ด๊ฐ€ ๋‚˜์™”์œผ๋‹ˆ ์ด๊ฑธ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๊ฒŒ ์—†์œผ๋ฉด...

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ถ•์ ํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ด๋ธ” ์ƒ์„ฑ
    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์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์ปค๋„ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ •ํ™•ํžˆ ์ „์—ญ ๋ณ€์ˆ˜ $wpdb๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ ํ›„์— ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด IP ์ฃผ์†Œ ๋˜๋Š” ํ•ด๋‹น 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

์ด์ œ "์œ ํ•ดํ•œ" 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

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ํ˜ธ์ŠคํŒ… ํŒจ๋„์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž ์žฌ์ ์ธ "์‚ฌ์•…ํ•œ" ๋ด‡์„ ์‹๋ณ„ํ•˜๊ณ  IP๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ถ”์‹ : ์ž๋ฃŒ๋Š” ์ €์ž์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€๋ฅผ ๋‚ด ์›น์‚ฌ์ดํŠธ์— ๊ฒŒ์‹œํ–ˆ์ง€๋งŒ Habre์—์„œ ๋” ํ™•์žฅ๋œ ๋ฒ„์ „์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€