文档章节

php获取客户端IP

DrChenXX
 DrChenXX
发布于 11/16 23:28
字数 472
阅读 6
收藏 0

php获取客户端IP

首先先阅读关于IP真实性安全的文章:如何正確的取得使用者 IP?

任何從客戶端取得的資料都是不可信任的!

  1. HTTP_CLIENT_IP头是有的,但未成标准,不一定服务器都实现。

    HTTP_CLIENT_IP头都是可以伪造的,所以就会造成获取IP不是真实IP,但并不意味着它们一无是处,生产环境中很多服务器隐藏在负载均衡节点后面,一般负载均衡节点会把前端实际的IP地址通过HTTP_CLIENT_IP,通过HTTP_CLIENT_IP只能获取的负载均衡节点的IP地址。

  2. HTTP_X_FORWARDED_FOR 是有标准定义,用来识别经过HTTP代理后的客户端IP地址,格式:clientip,proxy1,proxy2http://zh.wikipedia.org/wiki/X-Forwarded-For

    **HTTP_***头都很容易伪造。

  3. REMOTE_ADDR 是可靠的, 它是最后一个跟你的服务器握手的IP,可能是用户的代理服务器,也可能是自己的反向代理。

所以尽量记录相关信息进行判断:

/**
 * todo:获取客户端ip
 * @return array
 */
public static function GetIp(): array
{
    // 保存可靠IP为基准,其他IP保留备份
    $arr = array('ip'=>$_SERVER['REMOTE_ADDR']);
    $AllIP = array();
    $_SERVER['HTTP_CLIENT_IP'] = '0.0.0.0';
    foreach (array(
                 'HTTP_CLIENT_IP',
                 'HTTP_X_FORWARDED_FOR',
                 'HTTP_X_FORWARDED',
                 'HTTP_X_CLUSTER_CLIENT_IP',
                 'HTTP_FORWARDED_FOR',
                 'HTTP_FORWARDED',
                 'REMOTE_ADDR') as $key) {
        if (array_key_exists($key, $_SERVER)) {
            foreach (explode(',', $_SERVER[$key]) as $ip) {
                $ip = trim($ip);
                // filter_var PHP 原生过滤方法
                // filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)
                // FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
                // FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。
                if (filter_var($ip, FILTER_VALIDATE_IP)) {
                    $AllIP[$key] = $ip;
                }
            }
        }
    }
    $arr['AllIP'] = $AllIP;
    return $arr;
}

© 著作权归作者所有

共有 人打赏支持
上一篇: TOKEN设计
DrChenXX
粉丝 8
博文 47
码字总数 15682
作品 0
金华
程序员
私信 提问
负载均衡之后的如何让应用程序获取客户端真实IP

我们都知道部署负载均衡做服务器负载均衡的时候,在应用端就无法获取到客户端电脑的真实IP。这个都是因为我们在负载均衡上配置虚拟服务的时候启用了snat功能,将客户端发来的数据包的源IP替换...

北纬23度
2017/05/21
0
0
负载均衡之后的如何让应用程序获取客户端真实IP

我们都知道部署负载均衡做服务器负载均衡的时候,在应用端就无法获取到客户端电脑的真实IP。这个都是因为我们在负载均衡上配置虚拟服务的时候启用了snat功能,将客户端发来的数据包的源IP替换...

北纬23度
2017/05/21
0
0
nginx设置反向代理怎么获取客户端的真实IP和域名以供日志分析

版权声明:本文为EnweiTech原创文章,未经博主允许不得转载。 https://blog.csdn.net/English0523/article/details/80047851 nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得...

天府云创
04/23
0
0
php socket 基础测试

什么是TCP/IP、UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。 UDP(User Data Protoco...

ericSM
2016/08/25
21
0
如何统计你的应用的用户量以及用户的地域分布情况?

下载地址 (百度云) : http://pan.baidu.com/s/1pLCjfPx 背景 : 为了为以后提升用户体验 , 因此对安卓客户端的信息进行统计 原理 : 客户端 : 1. 安卓客户端启动初始化的时候 , 获取安卓设备的...

王一航
2016/09/09
53
1

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
12
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
9
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部