php获取用户真实IP和反刷机制的示例代码
1.如何获取用户的IP地址
公共静态函数getClientIp(){ if(getenv(' HTTP _ CLIENT _ IP '){ $ IP=getenv(' HTTP _ CLIENT _ IP ');} if(getenv(' HTTP _ X _ REAL _ IP '){ $ IP=getenv(' HTTP _ X _ REAL _ IP ');} else if(getenv(' HTTP _ X _ FORWARDED _ FOR '){ $ IP=getenv(' HTTP _ X _ FORWARDED _ FOR ');$ips=explode(',',$ IP);$ IP=$ IPS[0];} else if(getenv(' REMOTE _ ADDR '){ $ IP=getenv(' REMOTE _ ADDR ');} else { $ IP=' 0 . 0 . 0 . 0 ';}返回$ ip}注意:
$_SERVER和getenv的区别在于getenv不支持iis的isapi模式。PHP getenv ("remote _ addr ")函数通常可以在apache下获取ip地址,但在iis中没有效果。$_SERVER['REMOTE_ADDR']函数可以成功获取apache中访问者的ip地址,在IIS下也是有效的。
1.关于远程ADDR
这个变量获取《直接来源》的IP地址,它指的是直接请求这个地址的客户端的IP。在单个服务器的情况下,该IP正好是客户端IP,不能伪造。当然,并不是所有的程序都一定是单个服务器。例如,在负载平衡的情况下(如haproxy或nginx用于负载平衡),这个IP是转发机器的IP,因为这个过程是客户端-负载平衡-服务器。由负载平衡服务器而不是客户端直接访问。
第二,关于基于《直接来源》的HTTP_X_FORWARDED_FOR和HTTP_CLIENT_IP,在负载均衡的情况下,无法直接使用REMOTE_ADDR获取客户端IP,这是必须解决的问题。因此衍生出负载均衡端,将客户端IP加入HEAD并发送给服务器,让服务器获取客户端的真实IP。当然,还有你提到的赝品。毕竟除了协议中的固定数据,HEAD的其他数据都可以自定义。
Iii .为什么需要获取HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR和REMOTE_ADDR才能在互联网上找到获取客户端IP的代码?这是因为《一》和《一》又考虑到了程序的通用性。假设您直接在程序中编写REMOTE_ADDR,有一天您的程序需要负载平衡,那么您必须更改它。当然,如果你想这样做,看看你的爱好和应用场景。您也可以仅用REMOTE_ADDR封装一个方法,并在必要时更改该方法。
总结:
HTTP_CLIENT_IP:中有一些头文件,但是并不规范,也不是所有的服务器都实现了。
x-forward-For(XFF):是一个HTTP请求头字段,用于标识通过HTTP代理或负载平衡连接到Web服务器的客户端的原始IP地址。格式为clientip、proxy1和proxy2
REMOTE_ADDR:比较可靠,它是和你服务器握手的最后一个IP,可能是用户的代理服务器,也可能是自己的反向代理。
转发和真实知识产权的区别:
转发用于记录代理信息。每次代理通过一级代理(匿名代理除外)时,代理服务器都会将此请求的源IP追加到X-forward-For,而X-Real-IP没有相关标准,在不同的代理环境中其值也不固定
有关这方面的更多讨论,请参考https://www.douban.com/group/topic/27482290/
1.负载平衡:
在生产环境中,许多服务器隐藏在负载平衡节点后面,您只能通过REMOTE_ADDR获得负载平衡节点的ip地址。一般的负载均衡节点会通过HTTP_CLIENT_ip或者HTTP_X_FORWARDED_FOR传递前端的实际IP地址。
后端再次读取该值是可信的,因为它是由负载平衡节点而不是客户端告知的。但是当你的服务器直接暴露在客户端面前的时候,请不要相信这两种读取方法,直接读取REMOTE_ADDR即可
2.社区发展网络的情况:
因此,当我们获得用户的IP时,我们应该截取http _ x _ forwarded _ for的第一个有效IP(不是未知的)。
多层代理类似于cdn。
注意:
无论是REMOTE_ADDR还是HTTP_FORWARDED_FOR,这些标头消息可能都不可用,因为不同的浏览器和不同的网络设备可能会发送不同的IP标头消息
二.防止IP注入攻击
添加以下代码以防止IP注入攻击:
//合法验证IP地址,防止IP注入攻击$long=sprintf('%u ',ip2 long($ IP));$ip=$long?array($ip,$long) : array('0.0.0.0 ',0);一般在获取ip后,将其更新为数据库代码,如:$ SQL=' update t _ users set log in _ IP=' '。' get _ client _ IP(),'哪里.如果收到的IP地址是:XXX . XXX . XXX ';从t _ users中删除;-,代入参数的SQL语句变为:‘update t _ users set log in _ IP=‘XXX . XXX . XXX’;从t _ users中删除;哪里.
因此,在获取IP地址后,一定要使用正则化来验证IP地址的有效性,一定要使用参数化的SQL命令
解析:
函数的作用是:将格式化的字符串写入变量。% u-不带符号的十进制数(大于或等于0)
int ip2long(字符串$ip_address ) :
返回转换后的IP地址数,如果ip_address无效,则返回FALSE。
注意:
示例显示在PHP4和PHP5函数:中使用printf()打印转换后的地址
?PHP $ IP=gethostbyname(' www . example.com ');$ long=ip2 long($ IP);如果($long==-1 || $long===FALSE) { echo '无效IP,请重试';} else { echo $ip。\ n ';//192.0.34.166回声$long。\ n ';//-1073732954 printf('%u\n ',ip2 long($ IP));//3221234342}?1.因为PHP的整数类型是有符号的,32位系统中有很多为负的IP地址,所以需要使用“%u”来转换sprintf()或printf()获得的字符串,以表示无符号的IP地址。
2.ip2long()将返回FALSE。当IP为255.255.255.255时,版本为PHP 5=5.0.2。PHP 5.0.3修复后会返回-1(与PHP4相同)
三.防刷机构
获取IP后,我们可以做一些反刷操作:
//ip限制$ IP=GetClientIP();$ ipKey=' activity _ key _ { $ ip }if(!frequencycheckwithttimeinsache($ ipKey,$duration,$ limitTimes)){ return false;}返回true//Limit id,request $ times public static function frequency check with times incache($ ID,$second,$ times){ $ value=yii :3360 app()-cache-get($ ID)最多在$ second time以内;if(!$ value){ $ data[]=time();yii : app()-缓存集($id,json_encode($data),$ second);返回真;} $data=json_decode($value,true);if(count($ data)1=$ times){ $ data[]=time();yii : app()-缓存集($id,json_encode($data),$ second);返回真;} if(time()-$ data[0]$ second){ array _ shift($ data);$ data[]=time();yii : app()-缓存集($id,json_encode($data),$ second);返回真;}返回false}示例:
将请求限制在每小时不超过50个
if(!frequency checkwithttimeincache(' times _ uid _ ')。$ uid,3600,50)){返回'请求太频繁';}防刷升级限制装备数量:
//设备号一设备号最多只能抽3次如果(!empty($ deviceId)){ $ deviceUseChance=yii :3360 app()-db-createCommand()-select(' count(id)')-from(' activity 0167 _ log ')-其中(' device_id=:deviceId ',[' deviceId '=$ deviceId])-query scalar();$ deviceChance=3-$ deviceUseChance;}对于获取IP地址,也可以在大数据中分析用户的地理位置,比如做一些精准投放。
摘要
以上是边肖介绍的php获取用户真实IP和防刷机制的示例代码。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!
版权声明:php获取用户真实IP和反刷机制的示例代码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。