Мое приложение отслеживает IP-адрес пользователей, регистрирующихся на сайте. Отслеживание работало нормально на обычном веб-сервере (мы были на hostgator), но, казалось, начали отслеживать нечетные IP-адреса, когда мы переключались на платформу PaaS (pagodabox). После разговора с поддержкой pagodabox они сообщили мне, что код-кодировщик IPs собирал IP-адреса балансировщика нагрузки / маршрутизаторов pagodabox и получить фактический IP-адрес пользователя, мне пришлось бы использовать HTTP_X_FORWARDED_FOR
Я использовал функцию входного класса codeigniter $this->input->ip_address()
чтобы восстановить IP-адрес пользователя. Я посмотрел на функцию и заметил, что у них есть какие-то функции, чтобы HTTP_X_FORWARDED_FOR
значение HTTP_X_FORWARDED_FOR
IP, но я не уверен, как его использовать. Нужно ли мне что-то менять / добавлять в конфигурацию?
EDIT: после того, как несколько пользователей указали, куда я должен добавить в список IP-адресов балансировщиков нагрузки, встал вопрос: что мне делать, если часто меняется список IP-адресов? (то есть без статического IP-адреса, все динамические)
Я уверен, что вы уже решили это, но я думал, что отправлю правильный ответ для будущей справки. Я столкнулся с этой же проблемой (используя балансировщики нагрузки на AWS с приложением CodeIgniter.) Как вы указали, достаточно легко получить правильный IP-адрес за балансировщиком нагрузки или другой распределенной средой с использованием заголовка HTTP_X_FORWARDED_FOR. Проблема в том, как мы правильно реализуем это решение в CodeIgniter? Как следует из предыдущего ответа: Напишите свою собственную функцию IP. Проблема с этим, что, если ip_address () вызывается во всем приложении? Не лучше ли было бы переопределить эту функцию (с тем, который смотрит на правильный заголовок)? CodeIgniter имеет удобный механизм для этого, что удобно:
Решение состоит в том, чтобы расширить класс ввода CodeIgniter, создав новый файл класса в / application / core с именем MY_Input.php (MY_ – настраиваемый префикс для расширений, вы можете изменить его в своем файле конфигурации). С помощью расширений вы можете создать функцию имени SAME как исходного метода класса, не нарушая ничего, и не редактируя файлы ядра. 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, заголовок HTTP_X_FORWARDED_FOR всегда содержит правильный IP-адрес клиента.
Решение Oliver работает, но в некоторых случаях лучше использовать следующее, если вам известны IP-адреса прокси-сервера, которые используются. Отредактируйте файл application / 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(); ?>
Я столкнулся с версией решения Thava, которая отлично подходит для ситуаций, когда IP-адреса балансировки нагрузки могут меняться (например, AWS) и по-прежнему использовать файлы конфигурации CI. Когда вы знаете, что работаете за LB, вы можете изменить config.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 для чтения этого файла в системном бутстрапе, чтобы изменить конфигурацию моих приложений, обновив такие значения, как список IP-адресов прокси, путь кэш-памяти, домен cookie и т. Д.
В вашем случае вы можете добавить указанный IP-адрес Load-Balancer в $config['proxy_ips']
( application/config/config.php
), например:
$config['proxy_ips'] = ['192.168.1.2'];
В соответствии с вашей динамической проблемой IP вы можете замаскировать диапазон IP для сети Load-Balancer, например:
$config['proxy_ips'] = '192.168.1.0/24';
Функция маски работает в Codeigniter 3
$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-адресов.