Сегодня пришёл pull-request в Yii на эту тему. В классе CHttpRequest
есть метод getUserHostAddress
, который отдаёт нам IP пользователя. Предложение было перед возвратом $_SERVER['REMOTE_ADDR']
проверить, а нет ли чего в $_SERVER['HTTP_X_FORWARDED_FOR']
, и, если есть — вернуть. Мотивация — будут видны IP пользователей за прокси.
Так как такое заблуждение встречается ну очень часто, я даже не сразу вспомнил, откуда берётся $_SERVER['HTTP_X_FORWARDED_FOR']
. А берётся он из заголовка HTTP запроса X-Forwarded-For
и означает это то, что придти нам может что угодно.
А теперь представим, что разработчик воспользовался изменённым методом getUserHostAddress
, проверяющим X-Forwarded-For
:
if(in_array(Yii::app()->request->getUserHostAddress(), $allowedAddresses))
{
}
Тем, кто пишет на Zend Framework, кстати, стоит проверить свой код потому как Zend_Controller_Request_Http::getClientIp()
без переданного аргументом false
как раз проверяет X-Forwarded-For
:
@param @return
public function getClientIp($checkProxy = true)
{
if ($checkProxy && $this->getServer('HTTP_CLIENT_IP') != null) {
$ip = $this->getServer('HTTP_CLIENT_IP');
} else if ($checkProxy && $this->getServer('HTTP_X_FORWARDED_FOR') != null) {
$ip = $this->getServer('HTTP_X_FORWARDED_FOR');
} else {
$ip = $this->getServer('REMOTE_ADDR');
}
return $ip;
}
Заслал репорт в трекер Zend Framework на всякий случай.