2019独角兽企业重金招聘Python工程师标准>>>
最近遇到个这个问题,短信被盗刷,然后查原因,发现一直被一个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/