Здравствуйте! Вопрос по этому скрипту:
http://usefulscript.ru/temporary_avtoban.php
Всё сделал по инструкции, объединив код с кодом из сообщения выше, в итоге получился такой код:
<?php
function getRealIP() {
$result = false;
$proxy_headers = array(
'CLIENT_IP',
'FORWARDED',
'FORWARDED_FOR',
'FORWARDED_FOR_IP',
'HTTP_CLIENT_IP',
'HTTP_FORWARDED',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED_FOR_IP',
'HTTP_PC_REMOTE_ADDR',
'HTTP_PROXY_CONNECTION',
'HTTP_VIA',
'HTTP_X_FORWARDED',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED_FOR_IP',
'HTTP_X_IMFORWARDS',
'HTTP_XROXY_CONNECTION',
'VIA',
'X_FORWARDED',
'X_FORWARDED_FOR'
);
foreach($proxy_headers as $proxy_header) {
if ($result !== false) continue;
if(isset($_SERVER[$proxy_header])) {
preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/", $_SERVER[$proxy_header],$matches);
if (isset($matches[0])) {
$result = $matches[0];
continue;
}
}
else if(stristr(',', $_SERVER[$proxy_header]) !== FALSE) {
$proxy_header_temp = trim(array_shift(explode(',', $_SERVER[$proxy_header])));
if(($pos_temp = stripos($proxy_header_temp, ':')) !== FALSE) $proxy_header_temp = substr($proxy_header_temp, 0, $pos_temp);
if(preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $proxy_header_temp)){
$result = $_SERVER[$proxy_header];
continue;
}
}
}
if ($result === false){
$result = $_SERVER['REMOTE_ADDR'];
}
if (preg_match("#([0-9]+\.).*#", $result, $m)){
if ($m[1] == "10." || $m[1] == "100."){
$result = $_SERVER['REMOTE_ADDR'];
}
}
if (preg_match("#([0-9]+\.[0-9]+\.).*#", $result, $m)){
if ($m[1] == "192.168."){
$result = $_SERVER['REMOTE_ADDR'];
}
}
return $result;
};
$bot='';
$ip=getRealIP();
if (strstr($_SERVER['HTTP_USER_AGENT'], 'Yandex')) $bot='Yandex';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Google')) $bot='Google';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Yahoo')) $bot='Yahoo';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Mail')) $bot='Mail';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot')) $bot='Googlebot';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot-News')) $bot='Googlebot-News';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot-Image')) $bot='Googlebot-Image';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Googlebot-Video')) $bot='Googlebot-Video';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Mediapartners-Google')) $bot='Mediapartners-Google';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'AdsBot-Google')) $bot='AdsBot-Google';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'AdsBot-Google-Mobile-Apps')) $bot='AdsBot-Google-Mobile-Apps';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexBot')) $bot='YandexBot';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexImages')) $bot='YandexImages';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexVideo')) $bot='YandexVideo';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexMedia')) $bot='YandexMedia';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexBlogs')) $bot='YandexBlogs';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexAddurl')) $bot='YandexAddurl';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexFavicons')) $bot='YandexFavicons';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexDirect')) $bot='YandexDirect';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexMetrika')) $bot='YandexMetrika';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexCatalog')) $bot='YandexCatalog';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexNews')) $bot='YandexNews';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'YandexImageResizer')) $bot='YandexImageResizer';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Bingbot')) $bot='Bingbot';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Slurp')) $bot='Slurp';
elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'Mail.Ru')) $bot='Mail.Ru';
if ($bot=='') {
$db=mysqli_connect("localhost","логин","пароль","имя_бд");
$res=mysqli_query($db,"INSERT INTO all_visits (ip,date) VALUES
(INET_ATON('".$ip."'),'".time()."')");
$res=mysqli_query($db,"SELECT count(id) FROM all_visits WHERE
(ip=INET_ATON('".$ip."') and date>'".(time()-10)."') LIMIT 1");
$count_visit=mysqli_fetch_array($res);
if ($count_visit[0]>10) {
$res=mysqli_query($db,"INSERT INTO black_list_ip (ip,date) VALUES
(INET_ATON('".$ip."'),'".time()."')");
$start_line=0;
$lines='';
$ln_hta='';
$fh=fopen(".htaccess", "a+");
flock($fh, LOCK_EX);
fseek($fh, 0);
while (!feof($fh)) $lines.=fread($fh,2048);
$lines=explode("\n", $lines);
for ($n=0; $n<=count($lines); $n++) {
if (strstr($lines[$n],"Order Allow,Deny")) $start_line=$n;
}
if ($start_line!=0) for ($n=0; $n<$start_line; $n++) $ln_hta[]=$lines[$n];
else $ln_hta=$lines;
$ln_hta[]="Order Allow,Deny";
$ln_hta[]="Allow from all";
$res=mysqli_query($db,"SELECT INET_NTOA(ip) AS ip,date FROM black_list_ip
ORDER BY INET_ATON(ip)");
while ($bad_ip=mysqli_fetch_array($res)) {
if (time()<($bad_ip[date]+900))$ln_hta[]=" deny from ".$bad_ip[ip];
}
$ln_hta=implode("\n",$ln_hta);
ftruncate($fh, 0);
fwrite($fh, $ln_hta);
flock($fh, LOCK_UN);
fclose($fh);
}
}
?>
В таблицу all_visits визиты записываются, в этой части вроде как всё работает.
Но похоже не работает самая главная функция - запись в таблицу black_list_ip и блокирование ip.
Я решил это проверить, попробовав "забанить себя". Открывал ссылки на сайте с бешеной скоростью, за 10 секунд открыл наверно 20 страничек, но ничего не произошло. Мой ip не забанился, в таблице black_list_ip и .htaccess не появился.
Что может быть не так?