Сегодня пришёл 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 на всякий случай.


