Я использую $_SERVER["REMOTE_ADDR"]
получить IP-адрес пользователя за месяцы. В последнее время я заметил, что это значение может иногда содержать IP-адрес прокси-сервера, а не IP-адрес пользователя, что делает его бесполезным для меня. (Я заметил эту проблему после того, как обновил до PHP 7.1.0, хотя я попытался перейти на предыдущую версию PHP, и результаты были идентичны).
Я прочитал тонны SO вопросов, и большинство из них только решают эту проблему без решения или предлагают следующую функцию в качестве решения:
function get_ip() {
$ipaddress = '';
if (getenv('HTTP_CLIENT_IP'))
$ipaddress = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
else if(getenv('HTTP_X_FORWARDED'))
$ipaddress = getenv('HTTP_X_FORWARDED');
else if(getenv('HTTP_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_FORWARDED_FOR');
else if(getenv('HTTP_FORWARDED'))
$ipaddress = getenv('HTTP_FORWARDED');
else if(getenv('REMOTE_ADDR'))
$ipaddress = getenv('REMOTE_ADDR');
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
Это также ненадежно, потому что эти разные переменные могут быть подделаны.
Существуют ли хорошие и надежные решения для получения правильного IP-адреса пользователя, а не промежуточных прокси-серверов?
function checkIPAddress()
{
// Get IP Address using $_SERVER['REMOTE_ADDR'];
$ipaddress = ($_SERVER('REMOTE_ADDR')) ? $_SERVER('REMOTE_ADDR') : '';
if ( filter_var ($ipaddress, FILTER_VALIDATE_IP) == false)
{
//Log bad IP attempt
}
else{
//Received valid IP Address, run next code here.
}
}
Разрешить HTTP_X_FORWARDED — вредная привычка. Используйте его, когда вы используете прокси-сервер, балансировку нагрузки или при необходимости и т. Д.
Других решений пока нет …