Maayong adlaw! Sa artikulo isulti ko kanimo kung giunsa ang mga tiggamit sa regular nga pag-host makadakop sa mga IP address nga makamugna og sobra nga pagkarga sa site ug dayon babagan kini gamit ang mga himan sa pag-host, adunay "gamay nga" php code, pipila ka mga screenshot.
Input nga datos:
- Website nga gihimo sa CMS WordPress
- Pag-host sa Beget (dili kini usa ka ad, apan ang mga screenshot sa admin panel gikan sa kini nga partikular nga taghatag sa hosting)
- Ang WordPress site gilunsad sa usa ka dapit sa sayong bahin sa 2000 ug adunay daghang mga artikulo ug materyales
- PHP nga bersyon 7.2
- Ang WP adunay pinakabag-o nga bersyon
- Sulod sa pipila ka panahon karon, ang site nagsugod sa pagmugna og taas nga load sa MySQL sumala sa hosting data. Kada adlaw kini nga kantidad milapas sa 120% sa naandan matag account
- Sumala sa Yandex. Ang Metrica site gibisitahan sa 100-200 ka tawo kada adlaw
Una sa tanan, kini gibuhat:
- Ang mga lamesa sa database gilimpyohan sa natipon nga basura
- Ang wala kinahanglana nga mga plugin gi-disable, ang mga seksyon sa outdated nga code gikuha
Sa parehas nga oras, gusto nako nga ipunting ang imong atensyon sa kamatuoran nga ang mga kapilian sa pag-cache (mga plugin sa pag-cache) gisulayan, gihimo ang mga obserbasyon - apan ang pagkarga sa 120% gikan sa usa ka site wala mausab ug mahimo ra nga motubo.
Unsa ang gibanabana nga pagkarga sa mga database sa pag-host
Sa ibabaw mao ang site nga gipangutana, sa ubos ra ang ubang mga site nga adunay parehas nga cms ug gibana-bana nga parehas nga trapiko, apan naghimo og gamay nga load.
ΠΠ½Π°Π»ΠΈΠ·
- Daghang mga pagsulay ang gihimo sa mga kapilian sa pag-cache sa datos, ang mga obserbasyon gihimo sa daghang mga semana (maayo na lang, niining panahona ang pag-host wala gyud misulat kanako nga ako daotan kaayo ug maputol)
- Adunay usa ka pagtuki ug pagpangita alang sa hinay nga mga pangutana, unya ang istruktura sa database ug tipo sa lamesa gamay nga nabag-o
- Alang sa pag-analisar, una namong gigamit ang built-in nga AWStats (sa ingon, nakatabang kini sa pagkalkulo sa pinakagrabe nga IP address base sa gidaghanon sa trapiko.
- Metric - ang metric naghatag ug impormasyon bahin lang sa mga tawo, dili bahin sa mga bot
- Adunay mga pagsulay sa paggamit sa mga plugins alang sa WP nga makasala ug maka-block sa mga bisita bisan sa nasud sa lokasyon ug lain-laing mga kombinasyon
- Ang usa ka bug-os nga radikal nga paagi nahimo nga pagsira sa site sa usa ka adlaw nga adunay nota nga "Kami gipadayon" - gihimo usab kini gamit ang bantog nga plugin. Sa kini nga kaso, gipaabut namon nga ang load mahulog, apan dili sa zero nga mga kantidad, tungod kay ang WP nga ideolohiya gibase sa mga kaw-it ug ang mga plugins magsugod sa ilang kalihokan kung adunay usa ka "kawit" nga mahitabo, ug sa wala pa mahitabo ang "kawit", ang mga hangyo sa database mahimo gihimo na
Ideya
- Kalkulahin ang mga IP adres nga naghimo ug daghang mga hangyo sa mubo nga panahon.
- Irekord ang gidaghanon sa mga hit sa site
- I-block ang pag-access sa site base sa gidaghanon sa mga hit
- I-block gamit ang "Deny from" entry sa .htaccess file
- Wala nako gikonsiderar ang ubang mga kapilian, sama sa mga iptable ug mga lagda alang sa Nginx, tungod kay nagsulat ako bahin sa pag-host
Usa ka ideya ang nagpakita, mao nga kini kinahanglan nga ipatuman, ingon nga wala kini ...
- Paghimo og mga lamesa aron matigom ang datos
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;
- Maghimo kita og usa ka file diin atong ibutang ang code. Ang code magrekord sa mga blocking nga mga lamesa sa kandidato ug magtipig og kasaysayan alang sa pag-debug.
File code alang sa pagrekord sa mga 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);
Ang esensya sa code mao ang pagkuha sa IP address sa bisita ug isulat kini sa usa ka lamesa. Kung ang ip naa na sa lamesa, ang cnt field madugangan (ang gidaghanon sa mga hangyo sa site)
- Karon ang makahadlok nga butang ... Karon sunugon ko nila sa akong mga aksyon :)
Aron irekord ang matag hangyo sa site, among gikonektar ang file code sa panguna nga file sa WordPress - wp-load.php. Oo, giusab namo ang kernel file ug tukma nga pagkahuman sa global variable nga $wpdb anaa na
Mao nga, karon atong makita kung unsa ka sagad kini o kana nga IP address gimarkahan sa among lamesa ug gamit ang usa ka mug sa kape nga among tan-awon didto kausa sa matag 5 minuto aron masabtan ang litrato.
Dayon kopyaha lang ang "makadaot" nga IP, ablihi ang .htaccess file ug idugang kini sa katapusan sa file
Order allow,deny
Allow from all
# start_auto_deny_list
Deny from 94.242.55.248
# end_auto_deny_list
Mao ra kana, karon 94.242.55.248 - walay access sa site ug dili makamugna og load sa database
Apan sa matag higayon nga ang pagkopya pinaagi sa kamot nga sama niini dili kaayo matarong nga buluhaton, ug labut pa, ang kodigo gituyo nga mahimong awtonomiya.
Atong idugang ang usa ka file nga ipatuman pinaagi sa CRON matag 30 minuto:
Ang file code nga nag-usab sa .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)));
Ang file code kay yano ug primitive ug ang nag-unang ideya niini mao ang pagkuha sa mga kandidato alang sa pag-ali ug pagsulod sa mga lagda sa pag-block sa .htaccess nga file tali sa mga komentaryo
# start_auto_deny_list ug # end_auto_deny_list
Karon ang "makadaot" nga mga IP gibabagan sa ilang kaugalingon, ug ang .htaccess nga file ingon niini:
# 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
Ingon usa ka sangputanan, pagkahuman magsugod kini nga code, makita nimo ang resulta sa panel sa pag-host:
PS: Ang materyal mao ang tagsulat, bisan kung gipatik nako ang bahin niini sa akong website, nakakuha ako usa ka labi nga gipalapdan nga bersyon sa Habre.
Source: www.habr.com