Получить реальный IP пользователя с помощью codeigniter
мое приложение отслеживает IP-адреса пользователей, входящих на сайт. Отслеживание отлично работало на обычном веб-сервере (мы были на hostgator), но, казалось, начали отслеживать нечетные IP-адреса, когда мы переключаемся на платформу PaaS (pagodabox) после разговора с поддержкой pagodabox они сообщили мне, что IPS codeigniter поднимает был IPs балансировщиков нагрузки/маршрутизаторов pagodabox и получить фактический IP-адрес пользователя, я должен был бы использовать HTTP_X_FORWARDED_FOR
я использовал функция входного класса codeigniter $this->input->ip_address()
для восстановления IP-адреса пользователя. Я посмотрел на функцию и заметил, что у них есть какие-то функции, чтобы отступить HTTP_X_FORWARDED_FOR
значение IP, но я не уверен, как его использовать. Должен ли я что-то изменить/добавить в конфигурацию?
EDIT: после того, как несколько пользователей указали, где я должен добавить в список IP-адресов балансировщиков нагрузки, возник новый вопрос: Что бы я сделал, если бы список IP-адресов часто менялся? (т. е. нет статического IP, все динамические)
7 ответов
Я уверен, что вы уже решили это, но я думал, что после правильного ответа на будущее. Я столкнулся с этой же проблемой(используя балансировщики нагрузки на AWS с приложением CodeIgniter.) Как вы указали, достаточно легко получить правильный IP-адрес за балансировщиком нагрузки или другой распределенной средой, используя заголовок HTTP_X_FORWARDED_FOR. Проблема в том, как правильно реализовать это решение в CodeIgniter? Как указывает предыдущий ответ: напишите свою собственную функцию IP. Проблема в том, что если ip_address() вызывается во всем вашем приложении? Не лучше ли переопределить эту функцию (с тем, который смотрит на правильный заголовок)? CodeIgniter имеет удобный для этого механизм, который удобен:
решение состоит в том, чтобы расширить входной класс CodeIgniter, создав новый файл класса в /application/core под названием MY_Input.php (MY_-настраиваемый префикс для расширений, его можно изменить в конфигурационном файле). С расширениями вы можете создайте функцию с тем же именем, что и исходный метод класса, не нарушая ничего и не редактируя основные файлы. Вместо этого CodeIgniter будет использовать ваш новый метод. Ваш расширенный класс ввода будет выглядеть примерно так:
class MY_Input extends CI_Input {
function __construct()
{
parent::__construct();
}
//Overide ip_address() with your own function
function ip_address()
{
//Obtain the IP address however you'd like, you may want to do additional validation, etc..
$correct_ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
return $correct_ip_address;
}
}
таким образом, мы изменили поведение ядра без взлома фреймворка, и существующие вызовы ip_address() во всем вашем приложении теперь будут использовать ваш метод.
что касается работы с другими IP-адресами в цепочке, если вы интересует только IP клиента, это не должно иметь значения. По крайней мере, в AWS load balancers заголовок HTTP_X_FORWARDED_FOR всегда содержит правильный IP-адрес клиента.
решение Оливера работает, но в некоторых случаях лучше использовать следующее, Если вы знаете IP-адреса прокси, которые используются. Отредактируйте приложение / config / config.php файл включает в себя следующее:
$config['proxy_ips'] = '1.2.3.4, 2.3.4.5';
также имейте в виду, что информация заголовка обычно ненадежна и не должна использоваться в целях безопасности. Например, это не редкость, чтобы ограничить пользователей администратора использовать только одни белый список IP-адресов.
<?php
function getIPfromXForwarded()
{
$ipString = @getenv("HTTP_X_FORWARDED_FOR");
$addr = explode(",",$ipString);
return $addr[sizeof($addr)-1];
}
?>
попробуйте что-то вроде этого. Посмотрим, сработает ли. Использование:
<? echo getIPfromXForwarded(); ?>
в вашем случае вы можете добавить указанный IP балансировщика нагрузки в $config['proxy_ips']
(application/config/config.php
), например:
$config['proxy_ips'] = ['192.168.1.2'];
динамический прокси IP:
в соответствии с вашей динамической проблемой IP вы можете замаскировать диапазон IP для сети балансировки нагрузки, например:
$config['proxy_ips'] = '192.168.1.0/24';
функция маски способна в Codeigniter 3
получить метод IP:
$this->input->ip_address();
пока $this
относится к CI пример.
этот метод учитывает параметр $config ['proxy_ips'] и возвращает сообщенный адрес HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP, HTTP_X_CLIENT_IP или HTTP_X_CLUSTER_CLIENT_IP для разрешенных IP-адресов.
я наткнулся на версию решения Thava, которая отлично подходит для ситуаций, когда IPs балансировщика нагрузки может меняться (например, AWS) и по-прежнему использует конфигурационные файлы СНГ изначально. Когда вы знаете, что работаете за LB, вы можете изменить конфигурацию.php должен быть:
$config['proxy_ips'] = isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : '';
зная, что REMOTE_ADDR всегда будет текущим LB.
спасибо Эрик Браун здесь https://expressionengine.com/forums/archive/topic/185751/amazon-load-balancing-and-codeigniter-configproxy_ips#925678
Я знаю, что есть хороший ответ, который имеет отношение к вашему вопросу и принимается вами, но для будущих пользователей я разделяю функцию, которая отлично работает для меня во всех ситуациях.
public function ip()
{
$ipaddress = '';
if ($_SERVER['HTTP_CLIENT_IP'])
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if($_SERVER['HTTP_X_FORWARDED_FOR'])
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if($_SERVER['HTTP_X_FORWARDED'])
$ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if($_SERVER['HTTP_FORWARDED_FOR'])
$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if($_SERVER['HTTP_FORWARDED'])
$ipaddress = $_SERVER['HTTP_FORWARDED'];
else if($_SERVER['REMOTE_ADDR'])
$ipaddress = $_SERVER['REMOTE_ADDR'];
else
$ipaddress = 'UNKNOWN';
echo $ipaddress ;
}
У меня была такая же ситуация на работе, за исключением того, что IP-адреса не были действительно "динамическими", но "люди инфраструктуры", управляющие прокси и балансировщики нагрузки, использовали их для изменения по нераскрытым причинам. Поэтому нам пришлось договариваться, и мы придумали решение, создающее крюк в их инструменте управления конфигурацией/предоставлением, чтобы написать конфигурационный файл где-нибудь (в папке, доступной для пользователя, работающего с нашим Apache/PHP).
поэтому я использовал крючок CI для чтения этого файла в системе bootstrap для изменения конфигурации моих приложений, обновления значений, таких как список IP-адресов прокси, путь кэша, домен cookie и т. д.