Сегодня пришёл 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
:
/** * Get the client's IP addres * * @param boolean $checkProxy * @return string */ 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 на всякий случай.