热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP如何严格获取真实用户IP?

2019独角兽企业重金招聘Python工程师标准最近遇到个这个问题,短信被盗刷,然后查原因,发现一直被一个ip给不停的调用短信接口&

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最近遇到个这个问题,短信被盗刷,然后查原因,发现一直被一个ip给不停的调用短信接口,无可奈何,谁让这个ip是我服务器的ip啊,后来想想也许是伪造的ip地址!那咱就获取真是ip做判断。 php来获取客户端ip的变量有这些:

》 $_SERVER['HTTP_CLIENT_IP'] // 这个头饰有的,但是很少,有些服务器实现不了。而且客户端可以伪造,我自己测试的时候就没有获取ip。
》 $_SERVER['HTTP_X_FORWARDED_FOR'] //用来识别经过HTTP代理后的客户端ip地址,格式:
clientip,proxy1,proxy2.客户端可以伪造。详情:http://zh.wikipedia.org/wiki/X-Forwarded-For。
》 $_SERVER['REMOTE_ADDR']
//是最可靠的,它是最后一个跟你的服务器握手的IP,
//也可能是用户的代理服务器,也可能是自己的反向代理。客户端不能伪造。
//(都扯到反向代理了。哈哈哈)

客户端可以伪造的参数必须过滤和验证! 很多人以为的$_SERVER变量里的东西都是可信的,其实并不然,$_SERVER['HTTP_CLIENT_IP'] 和$_SERVER['HTTP_X_FORWARDED_FOR']都是来自客户端请求的header里面。 如何要严格获取用户真是IP 没有套CDN,用户直连我们的PHP服务器

这种情况下用tcp层握手的ip,$_SERVER['REMOTE_ADDR']

自建集群用nginx实现负载均衡的时候

这种情况下,PHP应用服务器不能对外暴露,我们在nginx中实现获取真实IP再换发给PHP服务器。

location /{ proxy_set_header client-real-ip $remote_addr; } client-real-ip 可以随意自己命名,我们将tcp层中跟nginx握手的ip转发给PHP。

使用CDN,从PHP服务器取源的时候

CDN会转发客户端的握手ip过来,各家策略有差异,具体去查CDN的文档。

当然我们也可以把需要严格核查的业务绑一个二级域名,单独走我们自己的nginx服务器,避开CDN。

如果要宽松获取用户ip

这种情况比较简单,也是大部分开源程序使用的方式,因为他们要适应最广泛的部署环境, 依次获取和过滤,$_SERVER['HTTP_CLIENT_IP'],$_SERVER['HTTP_X_FORWARDED_FOR']的第一个ip,$_SERVER['REMOTE_ADDR'],谁先有值先用谁。注意这种方式,客户端可以提交假ip来欺骗服务器。

PHP如何验证和过滤客户端提交过来的ip。 博客链接:https://blog.haitun.me/get-real-client-ip/


转:https://my.oschina.net/gracebear/blog/893848



推荐阅读
author-avatar
自由战狼2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有