本文翻译自:How to get the client IP address in PHP [duplicate]

This question already has an answer here: 这个问题已经在这里有了答案:

  • What is the most accurate way to retrieve a user's correct IP address in PHP? 在PHP中检索用户正确IP地址的最准确方法是什么? 17 answers 17个答案

How can I get the client IP address using PHP? 如何使用PHP获取客户端IP地址?

I want to keep record of the user who logged into my website through his/her IP address. 我想保留通过其IP地址登录到我的网站的用户的记录。


#1楼

参考:https://stackoom.com/question/CbFp/如何在PHP中获取客户端IP地址-重复


#2楼

This is the method that I use, and it validates an IPv4 input: 这是我使用的方法,它可以验证IPv4输入:

// Get user IP address
if ( isset($_SERVER['HTTP_CLIENT_IP']) && ! empty($_SERVER['HTTP_CLIENT_IP'])) {$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && ! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {$ip = (isset($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0';
}$ip = filter_var($ip, FILTER_VALIDATE_IP);
$ip = ($ip === false) ? '0.0.0.0' : $ip;

#3楼

My favourite solution is the way Zend Framework 2 uses. 我最喜欢的解决方案是Zend Framework 2的使用方式。 It also considers the $_SERVER properties HTTP_X_FORWARDED_FOR , HTTP_CLIENT_IP , REMOTE_ADDR but it declares a class for it to set some trusted proxies and it returns one IP address not an array. 它还考虑了$_SERVER属性HTTP_X_FORWARDED_FORHTTP_CLIENT_IPREMOTE_ADDR但是它声明了一个用于设置某些受信任代理的类,并且返回一个IP地址而不是数组。 I think this is the solution that comes closest to it: 我认为这是最接近的解决方案:

class RemoteAddress
{/*** Whether to use proxy addresses or not.** As default this setting is disabled - IP address is mostly needed to increase* security. HTTP_* are not reliable since can easily be spoofed. It can be enabled* just for more flexibility, but if user uses proxy to connect to trusted services* it's his/her own risk, only reliable field for IP address is $_SERVER['REMOTE_ADDR'].** @var bool*/protected $useProxy = false;/*** List of trusted proxy IP addresses** @var array*/protected $trustedProxies = array();/*** HTTP header to introspect for proxies** @var string*/protected $proxyHeader = 'HTTP_X_FORWARDED_FOR';// [...]/*** Returns client IP address.** @return string IP address.*/public function getIpAddress(){$ip = $this->getIpAddressFromProxy();if ($ip) {return $ip;}// direct IP addressif (isset($_SERVER['REMOTE_ADDR'])) {return $_SERVER['REMOTE_ADDR'];}return '';}/*** Attempt to get the IP address for a proxied client** @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2* @return false|string*/protected function getIpAddressFromProxy(){if (!$this->useProxy|| (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies))) {return false;}$header = $this->proxyHeader;if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) {return false;}// Extract IPs$ips = explode(',', $_SERVER[$header]);// trim, so we can compare against trusted proxies properly$ips = array_map('trim', $ips);// remove trusted proxy IPs$ips = array_diff($ips, $this->trustedProxies);// Any left?if (empty($ips)) {return false;}// Since we've removed any known, trusted proxy servers, the right-most// address represents the first IP we do not know about -- i.e., we do// not know if it is a proxy server, or a client. As such, we treat it// as the originating IP.// @see http://en.wikipedia.org/wiki/X-Forwarded-For$ip = array_pop($ips);return $ip;}// [...]
}

See the full code here: https://raw.githubusercontent.com/zendframework/zend-http/master/src/PhpEnvironment/RemoteAddress.php 在此处查看完整的代码: https : //raw.githubusercontent.com/zendframework/zend-http/master/src/PhpEnvironment/RemoteAddress.php


#4楼

Here is a cleaner code sample of a good way to get the IP address of the user. 这是一个更干净的代码示例,它是获取用户IP地址的好方法。

$ip = $_SERVER['HTTP_CLIENT_IP'] ? $_SERVER['HTTP_CLIENT_IP'] : ($_SERVER['HTTP_X_FORWARDED_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']);

Here is a shorter version that uses the elvis operator: 这是使用elvis运算符的较短版本:

$_SERVER['HTTP_CLIENT_IP'] ? : ($_SERVER['HTTP_X_FORWARDED_FOR'] ? : $_SERVER['REMOTE_ADDR']);

Here is a version that uses isset to remove notices (thank you, @shasi kanth): 这是使用isset删除通知的版本(谢谢@shasi kanth):

$ip = isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];

#5楼

Like the following? 像下面吗?

if (($ip=filter_input(INPUT_SERVER, 'REMOTE_ADDR', validate_ip)) === false or empty($ip)) {exit;
}
echo $ip;

PS 聚苯乙烯

if (($ip=filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP|FILTER_FLAG_NO_PRIV_RANGE|FILTER_FLAG_NO_RES_RANGE)) === false) {header('HTTP/1.0 400 Bad Request');exit;
}

All headers beginning with 'HTTP_' or 'X-' may be spoofed, respectively is user defined. 可以欺骗所有以“ HTTP_”或“ X-”开头的标头,分别由用户定义。 If you want to keep track, use cookies, etc. 如果您想跟踪,请使用Cookie等。


#6楼

The following is the most advanced method I have found, and I have already tried some others in the past. 以下是我找到的最高级的方法,并且我过去已经尝试过其他方法。 It is valid to ensure to get the IP address of a visitor (but please note that any hacker could falsify the IP address easily). 确保获得访问者的IP地址是有效的(但请注意,任何黑客都可以轻易地伪造IP地址)。

function get_ip_address() {// Check for shared Internet/ISP IPif (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) {return $_SERVER['HTTP_CLIENT_IP'];}// Check for IP addresses passing through proxiesif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {// Check if multiple IP addresses exist in varif (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {$iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);foreach ($iplist as $ip) {if (validate_ip($ip))return $ip;}}else {if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR']))return $_SERVER['HTTP_X_FORWARDED_FOR'];}}if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED']))return $_SERVER['HTTP_X_FORWARDED'];if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR']))return $_SERVER['HTTP_FORWARDED_FOR'];if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED']))return $_SERVER['HTTP_FORWARDED'];// Return unreliable IP address since all else failedreturn $_SERVER['REMOTE_ADDR'];
}/*** Ensures an IP address is both a valid IP address and does not fall within* a private network range.*/
function validate_ip($ip) {if (strtolower($ip) === 'unknown')return false;// Generate IPv4 network address$ip = ip2long($ip);// If the IP address is set and not equivalent to 255.255.255.255if ($ip !== false && $ip !== -1) {// Make sure to get unsigned long representation of IP address// due to discrepancies between 32 and 64 bit OSes and// signed numbers (ints default to signed in PHP)$ip = sprintf('%u', $ip);// Do private network range checkingif ($ip >= 0 && $ip <= 50331647)return false;if ($ip >= 167772160 && $ip <= 184549375)return false;if ($ip >= 2130706432 && $ip <= 2147483647)return false;if ($ip >= 2851995648 && $ip <= 2852061183)return false;if ($ip >= 2886729728 && $ip <= 2887778303)return false;if ($ip >= 3221225984 && $ip <= 3221226239)return false;if ($ip >= 3232235520 && $ip <= 3232301055)return false;if ($ip >= 4294967040)return false;}return true;
}

如何在PHP中获取客户端IP地址[重复]相关推荐

  1. 在ASP.NET Core中获取客户端IP地址

    随着ASP.NET的发展,有不同的方式从请求中访问客户端IP地址.WebForms和MVC Web应用程序只是访问当前HTTP上下文的请求. var ip = HttpContext.Current. ...

  2. php 获取客户端位置信息_PHP中获取客户端IP地址所在的地理位置信息

    如何获得该IP所在的地理位置呢?腾讯的IP分享计划(http://fw.qq.com/ipaddress)和新浪的IP查询接口(http://int.dpool.sina.com.cn/iplooku ...

  3. 如何在 ASP.NET CORE 中获取客户端 IP ?

    咨询区 eadam: 在 ASP.NET 中我可以用 Request.ServerVariables["REMOTE_ADDR"] 来获取客户端IP地址,请问在 ASP.NET C ...

  4. php获取ip几种方法区别,php获取客户端IP地址的几种方法

    php获取客户端IP地址的几种方法 阅读php获取客户端IP地址的几种方法, 1:来看看代码: echo "(1)浏览当前页面的用户的 IP 地址为:"; echo $_SERVE ...

  5. springboot 获取客户端ip_JAVA如何获取客户端IP地址和MAC地址

    本文介绍了JAVA如何获取客户端IP地址和MAC地址 ,分享给大家,具体如下: 1.获取客户端IP地址 public String getIp(HttpServletRequest request) ...

  6. thinkphp 获取客户端ip地址方法

    /*** 获取客户端IP地址* @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字* @param boolean $adv 是否进行高级模式获取(有可能被 ...

  7. Service获取客户端IP地址(java)

    Java代码 <strong>1.基于jax-ws开发的webservice获取客户端ip的方法[在代理类XXXDelegate添加如下代码]:</strong> import ...

  8. vue中获取本地IP地址

    vue中获取本地IP地址 IP地址需要通过js获取: 网上有很多查询接口可以获取到IP,查到的搜狐的比较多,我这里就用搜狐的: http://pv.sohu.com/cityjson?ie=utf-8 ...

  9. java获取客户端IP地址工具类

    代码如下自取: import lombok.extern.slf4j.Slf4j;import javax.servlet.http.HttpServletRequest; import java.n ...

最新文章

  1. 学习node js 之微信公众帐号接口开发 准备工作之三
  2. icache的方面以及使用
  3. 复制文本朗读_原创:昭明文选配乐朗读 卷第五十一 论一 东方曼倩 非有先生论 王子渊 四子讲德论 并序...
  4. 年轻人选择创业时,最好避开门槛低的行业
  5. 5种成交话术,帮你多拿订单,挠到客户痒处,才有成交希望
  6. JVM之静态编译优化以及JIT编译
  7. AutoCAD2020命令提示框信息设置
  8. Go语言编程(旧读书笔记)
  9. 随机森林模型解释_随机森林解释
  10. ROS系列书籍--机械工业出版社
  11. 我们不曾向这个世界的庸俗低头
  12. 计算机主机usb端口使用不了,电脑usb接口不能用怎么办
  13. 头像怎么画,日系头像绘画教程
  14. 不知道怎么识别手写文字?快来看这些手写文字识别成文档软件
  15. studio 3t 如何链接开启验证的mongodb
  16. Java 面向对象(六)
  17. 利用ARCGIS和QGIS画等值线图
  18. vi复制粘贴(转贴+自己总结)
  19. Python scrapy 实现网页爬虫
  20. Mybatis分页插件配置

热门文章

  1. 深圳腾讯内部Jetpack宝典意外流出!极致经典,堪称Android架构组件的天花板
  2. 追根究底之追本溯源:光标
  3. android studio安装中出现Failed to install Intel HAXM错误的解决方法
  4. Android之利用回调函数onCreateDialog实现加载对话框
  5. excel函数大全_让你的EXCEL工作效率翻倍的函数大全
  6. DataTable 数据去重复
  7. http协议的Request Payload 和 Form Data 的区别
  8. python学习 day2 (3月2日)
  9. 知识回顾——构造函数
  10. [Week17] 个人阅读作业