Уведомление PHP: неопределенный индекс: HTTP_USER_AGENT в строке 2

Я добавил 3-строчный код в верхней части индексной страницы, чтобы устранить неверный запрос, возникающий на устройствах imac. Код приведен ниже:

<?php
if (preg_match ("/CaptiveNetworkSupport/", $_SERVER["HTTP_USER_AGENT"])) {
header ("HTTP/1.0 400 Bad Request");
exit ();
}
?>

Но я вижу много ошибок «PHP Notice: Undefined index: HTTP_USER_AGENT in» в error_log. Как я могу удалить эти журналы?

Спасибо!


person NewPHP    schedule 02.05.2013    source источник


Ответы (4)


Возможно, если вы проверите, существует ли индекс до preg_match:

    <?php
        if ( isset($_SERVER["HTTP_USER_AGENT"]) && preg_match ("/CaptiveNetworkSupport/", $_SERVER["HTTP_USER_AGENT"]) )
        {
            header ("HTTP/1.0 400 Bad Request");
            exit ();
        }
    ?>
person MISJHA    schedule 02.05.2013

Вы можете убедиться, что он установлен первым:

<?php
    if (isset($_SERVER["HTTP_USER_AGENT"]) && preg_match ("/CaptiveNetworkSupport/", $_SERVER["HTTP_USER_AGENT"])) {
        header ("HTTP/1.0 400 Bad Request");
        exit ();
    }
?>
person Matt Kantor    schedule 02.05.2013

Перенаправления заголовков, основанные на обнаружении пользовательского агента, могут быстро выйти из-под контроля. Довольно много сайтов, которые я унаследовал за эти годы, содержат массивные .htaccess файлы, которые замедляют соединение с сервером. Для проверки в будущем вы можете начать с массива поисковых запросов для проверки (что-то вроде черного списка). Я обычно храню свои в базе данных. Вот пример того, что работает для user_agents и ip_addresses с использованием одной и той же функции.

<?php
//user agent blacklist array
$uab = array(
'!^$!','!CaptiveNetworkSupport!','!curl!i'
);

//User agent handling array
$uah = array(
'HTTP/1.0 400 Bad Request','HTTP/1.0 400 Bad Request','HTTP/1.0 403 Forbidden',
);

$ipb = array(
'!^1\.2\.3!',
'!^8\.8\.8\.8!',
'!^199\.21!',
'!^0\.0\.0\.0$!',
);

$iph = array(
'Location: /no-bots.php',
'Location: /warning.php',
'HTTP/1.0 403 Forbidden',
'HTTP/1.0 403 Forbidden',
);


function blackList($blacklist,$handler,$means){

    foreach($blacklist as $key=>$bl){
        if (preg_match($bl,$means)){
            header($handler[$key]);
            exit();
        }
    }
}

if(!empty($_SERVER['HTTP_USER_AGENT'])){
  $user_agent = $_SERVER['HTTP_USER_AGENT'];    
} else {
  $user_agent = ''; 
}

blackList($uab,$uah,$user_agent);

//This should always be set!
if(!empty($_SERVER['REMOTE_ADDR'])){
  $ip_address = $_SERVER['REMOTE_ADDR'];    
} else {
    $ip_address = '0.0.0.0';
}

blackList($ipb,$iph,$ip_address);

?>

В моей собственной CMS у меня есть страница бана, которая позволяет бэкэнд-пользователю определить, как нарушитель будет наказан или с ним обращаются. Это полезно для блокировки всевозможных вещей и лучше всего использовать в сочетании с iptables.

person AbsoluteƵERØ    schedule 02.05.2013
comment
Я просто добавлю, что блокировка на основе пользовательского агента в любом случае часто бесполезна. Для клиентов тривиально лгать в своей строке UA. - person Matt Kantor; 02.05.2013

Используйте isset($_SERVER['HTTP_USER_AGENT']) или array_key_exists( 'HTTP_USER_AGENT', $_SERVER ), чтобы убедиться, что ключ HTTP_USER_AGENT вообще существует.

Когда вы ссылаетесь на несуществующий ключ, вы получаете уведомление. вы можете подавить уведомления глобально в конфигурации, но это очень плохая практика.

Вы можете подавить все ошибки для одного вызова с помощью @. напр.: @$_SERVER['HTTP_USER_AGENT']

(Извините за плохой английский)

person indriq    schedule 02.05.2013