@Ysery

Блокировщик ботов по IP, не получается корректно вписать исключение по User Agent, как сделать правильно?

Доброго времени суток, уважаемые специалисты.

Нашёл код в сети (блокирует куда не нужно ходящих ботов по IP адресу через htaccess), отредактировал его, но видимо не совсем корректно, не работает вот какой момент - исключение по User Agent браузера (там изначально исключение для IP адресов было).

Где ошибся и как правильно должно быть?

<?php
 
require_once(rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/wp-load.php');
 
$ip = $_SERVER['REMOTE_ADDR'];
 
$htaccess = '.htaccess';
 
$contents = file_get_contents($htaccess, TRUE) 
          OR exit('Unable to open .htaccess');
 
$exists = !stripos($contents, 'deny from ' . $ip . "\n") 
          OR exit('Already banned, nothing to do here.');
 
$date   = date('Y-m-d H:i:s');
$uri    = htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES);
$agent  = htmlspecialchars($_SERVER['HTTP_USER_AGENT'], ENT_QUOTES);
$agent  = str_replace(array("\n", "\r"), '', $agent);
 
$email = '';
 
$whitelist = array(
 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3855.80 Safari/537.36 OPR/62.0.3416.60',
 'YandexBot;',
 'YandexAccessibilityBot',
 'Googlebot',
 'bingbot',
 'Twitterbot',
 'proximic',
 'Applebot',
 'Mail.RU_Bot',
 'msnbot',
);
 
 
if (empty($_SERVER['HTTP_REFERER'])) {
 
  if (in_array($agent, $whitelist)) {
 
        echo "";
 
  } else {
 
        $ban =  "\n# The IP below was banned on $date for trying to access {$uri}\n";
    $ban .= "# Agent: {$agent}\n";
    $ban .= "# Deny from {$ip}\n";
 
    file_put_contents($htaccess, $ban, FILE_APPEND) 
		  OR exit('Cannot append rule to .htaccess');
 
        if (!empty($email)) {
      $message = "IP Адрес: {$ip}\n";
      $message .= "Дата/Время: {$date}\n";
      $message .= "Пользовательский Агент: {$agent}\n";
 
      wp_mail($email, 'Произошла блокировка по User Agent: ' . $ip, $message);
    }
 
    
  }
 
} ?>
  • Вопрос задан
  • 75 просмотров
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Нужно проверять подстроку, а не строку ($agent) сравнивать с элементами массива "белого" списка целиком.

Альтернативный вариант блокировки ботов: здесь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы