Nos potentiale identify "malum" automata et eos obstruunt ab IP

Nos potentiale identify "malum" automata et eos obstruunt ab IP

Salve! In articulo dicam vobis quomodo utentes regulares hospites capere possunt IP inscriptiones quae nimiam sarcinam generant in situ et tunc obstruunt utentes instrumenta hosting, "paxillum" erit ex php codice, paucae eenshotsscrae.

Data input:

  1. Website creata in CMS WordPress
  2. Hosting Eget (haec tabula non est, sed screenshots tabulae admin erunt ex hoc provisore obnoxio maxime)
  3. WordPress situs alicubi in primo MM demissus est et magnum numerum articulorum et materiarum habet
  4. PHP version 7.2
  5. WP has the latest version
  6. Aliquamdiu nunc, situm in MySQL onere alto generare coepit secundum data obnoxius. Quotidie hoc valore exceditur 120% normae per rationem
  7. Secundum Yandex. Metrica situs visitatur ab 100-200 hominibus per diem

Primum hoc factum est;

  1. Database mensae purgatur exaggeratus purgamentum
  2. Plutinas supervacaneae debiles erant, sectiones codicis outdated ablati sunt

Eodem tempore animum advertere vellem quod optiones caching (plugins caching) temptatae sunt, animadversiones factae sunt - sed pondus 120% ex uno loco mutatum est et tantum crescere potuit.

Quod onus proximus in databases hosting apparuit similis

Nos potentiale identify "malum" automata et eos obstruunt ab IP
In summo situs est de quo agitur, sicut infra aliae sites sunt quae idem cms et proxime idem mercatum habent, sed minus onere creant.

Анализ

  • Multi conatus cum optionum notitiarum caching, observationes per plures septimanas factae sunt (fortunate, hoc tempore hospes numquam mihi scripsit me tam malum esse et disiuncta fore)
  • Analysis facta est et quaesita per interrogationes tardas, tunc structurae datorum ac mensae genus leviter mutatum est
  • Pro analysi, praesertim nos aedificato in AWStats (obiter adiuvisti pessimum electronicum IP secundum negotiationis volumen computandum.
  • Metrica - metrica notitias tantum de hominibus praebet, non de autocinetis
  • Pluginina uti pro WP conati fuerunt qui visitatores sparguntur et obstruunt etiam per locorum locorum ac variarum compositiones
  • Omnino radicitus evasit ut ad locum claudendum diem cum nota "sub sustentatione sumus" - hoc etiam factum est utendo clarissimo plugin. In hoc casu exspectamus sarcinam demittere, non autem valores nihilo, quandoquidem WP ideologia in hamis innititur et plugins suam actionem incipiunt quando "hamus" occurrit, et antequam "hamus" incidit, petitiones datorum can. iam factus est

idea

  1. IP inscriptiones calculate qui multum petitiones faciunt in brevi tempore.
  2. Recordarentur numerum hits ad locum
  3. Obstructionum aditus ad locum secundum numerum hits
  4. Obstructionum utens "negare" ingressum in .htaccess lima
  5. Alias ​​optiones, sicut iptables et regulas de Nginx non consideravi, quia scribo de hosting

Idea apparuit, ita perficiendum est, ut sine hoc...

  • Tabulas creando cumulare notitia
    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;
    
  • Faciamus fasciculum in quo codicem ponemus. Codex in tabulis candidatis interclusionis notabit et historiam debugging habebunt.

    File code for recording IP address

    <?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);
    
    

    Codicis essentia est inscriptionem IP visitatoris acquirere et in tabula scribere. Si ip iam in mensa est, augebitur ager cnt (numerus petitionum ad locum)

  • Nunc scary rem.
    Ut singulas petitiones ad situs recordentur, tabella codicem ad principale WordPress fasciculi conectimus - wp-load.php. Ita fasciculi nuclei mutamus et praecise post global variabilis $wpdb iam existit

Nunc igitur videre possumus quoties haec vel illa IP oratio in nostra tabula designata est et cum calva capulus quae ibi inspicimus semel singula 5 minuta picturam comprehendere.

Nos potentiale identify "malum" automata et eos obstruunt ab IP

Tunc solum "noxium" IP effingo, aperi fasciculum .htaccessum et ad finem tabella adde

Order allow,deny
Allow from all
# start_auto_deny_list
Deny from 94.242.55.248
# end_auto_deny_list

Id est, nunc 94.242.55.248 - aditus ad locum non habet nec onus datorum generat.

Sed omne tempus exscribendi manu huius modi non iustissimum opus est, ac praeterea codicem suum esse autonomum.

Addamus fasciculum, quod per CRON singulis 30 minutis exsecutioni erit:

File code modifying .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)));

Codicis fasciculus valde simplex et primitivus est eiusque principalis idea est candidatos impedire et inire regulas interclusionis in fasciculo .htaccess inter commentarios inire.
# start_auto_deny_list and # end_auto_deny_list

Nunc IPS "noxia" inter se praecluduntur, et .ht accessum fasciculi simile hoc spectat:

# 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

Quam ob rem, postquam hoc signum incipit operari, eventum videre potes in tabella obnoxia:

Nos potentiale identify "malum" automata et eos obstruunt ab IP

PS: Materia auctoris est, quamquam partem eius edidi in nostro loco, versionem accuratiorem in Habre nactus sum.

Source: www.habr.com

Add a comment