PHP实现IP访问限制及提交次数的方法详解
一、原理
提交次数是肯定要往数据库里写次数这个数据的,比如用户登陆,当用户出错时就忘数据库写入出错次数1,并且出错时间,再出错写2,当满比如5次时提示不允许再登陆,请明天再试,然后用DateDiff计算出错时和now()的时间,如果大于24就再开放让他试。
封IP的话特别是给IP断就比较简单了,
先说给IP段开放的情况:先取出客户访问的IP,为了解释方便,设有IP192.168.6.2
现要开放IP段为192.168.*.*的断,给个比较容易看懂的代码吧:
url=split(ip,".") '这里的ip为客户端IP
fsip="192.168.*.*" '允许的段,可以从数据库取出,也可以这么定义
fip=split(fsip,".")
if fip(0)=url(0) and fip(1)=url(1) then
response.write "您的IP被封"
else response.write "可以通过"
end if
其实禁某IP就跟上面的方法一样。或者干脆从数据库里取出IP和客户端的直接比较就好了。
一般会把数据库里的IP段设为双精度型的,那么就需要这些:
if Request.ServerVariables("HTTP_X_FORWARDED_FOR")="" then
IP=Request.ServerVariables("REMOTE_ADDR")
else
IP=Request.ServerVariables("HTTP_X_FORWARDED_FOR")
end if
sip=IP
cip=split(ip,".")
ip=256*256*256*cip(0)+256*256*cip(1)+256*cip(2)+cip(3)-1
上面的情况都是在数据库操作方面,没涉及cookies等。
其实封IP不是很理想,会影响无辜的人,有关的或许是因为动态IP逃过了。
二、封装实例
<?php
class IP{ //获取客户IP地址
function getIpAdr(&$ip){
$ip1=getenv("HTTP_X_FORWARDED_FOR");
$ip2=getenv("HTTP_CLIENT_IP");
$ip3=getenv("REMOTE_ADDR");
if($ip1&&$ip1!='unknow')
$ip=$ip1; else if($ip2&&$ip2!='unknow')
$ip=$ip2; else if($ip3&&$ip3!='unknow')
$ip=$ip3; else
$ip='127.0.0.1';
}
}
function get_netip($myip){ //只留客户IP地址的前三位
$temp=explode(".",$myip);
$netip.=$temp[0];
$netip.=".";
$netip.=$temp[1];
$netip.=".";
$netip.=$temp[2];
return $netip;
}
$filename="test.ini"; //定义操作文件
$ip_lib=file($filename); //读取文件数据到数组中
$allow=0;
$IP=new IP;
$thisip="";
$IP->getIpAdr(&$thisip);
$thenetip=get_netip($thisip);
for ($i=0;$i<count($ip_lib);$i++){
if(ereg($thenetip,$ip_lib[$i])){
$allow=1;
break;
}
}
if ($allow==1)
{
echo "验证通过";
} else {
echo "<script>location.href='Error.php';</script>";
}
三、限制输入次数
1.页面需要先session_start();2.点击登陆的时候做判断,如果确定用户输入的密码是错误的
if(用户的密码是错误的){
if(!empty($_SESSION['login_error'])){
if($_SESSION['login_error'] == 3){
exit("这里已经是第三次了");
} else{
$_SESSION['login_error'] = $_SESSION['login_error']++;
}
} else{
$_SESSION['login_error'] = 1;
}
}
文章转载:https://mp.weixin.qq.com/s/kpvl88uza1owk8rhnhsJjg
PHP实现IP访问限制及提交次数的方法详解的更多相关文章
- PHP中IP地址与整型数字互相转换详解
这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...
- ip头、tcp头、udp头详解及定义,结合Wireshark抓包看实际情况
公司的同事们在分析网页加载慢的问题,忽然使用到了Wireshark工具,我就像发现新大陆一样好奇,赶紧看了看,顺便复习了一下相关协议.上学时学的忘的差不多了,汗颜啊! 报文封装整体结构 mac帧头定义 ...
- PHP转换IP地址到真实地址的方法详解
本篇文章是对PHP转换IP地址到真实地址的方法进行了详细的分析介绍,需要的朋友参考下 想要把IPv4地址转为真实的地址,肯定要参考IP数据库,商业的IP数据库存储在关系型数据库中,查询和使用都非常 ...
- C# 中4个访问符和8个修饰符详解
4个访问修饰符(是添加到类.结构或成员声明的关键字) Public:公有的,是类型和类型成员的访问修饰符.对其访问没有限制. Internal:内部的,是类型和类型成员的访问修饰符.同一个程序集中的所 ...
- TortoiseGit学习系列之TortoiseGit基本操作修改提交项目(图文详解)
前面博客 TortoiseGit学习系列之TortoiseGit基本操作克隆项目(图文详解) TortoiseGit基本操作修改提交项目 项目克隆完成后(可以将克隆 clone 理解为 下载,检出 c ...
- Git学习系列之Git基本操作提交项目(图文详解)
前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...
- [web] Get和Post区别,EncType提交数据的格式详解
转载自:http://www.cnblogs.com/sunxucool/archive/2012/12/11/2813113.html 1. get是从服务器上获取数据,post是向服务器传送数据. ...
- Get和Post区别,EncType提交数据的格式详解——转自他人博客的
1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过 ...
- flask-limiter限制单个IP访问的频率和次数
Flask-Limiter provides rate limiting features to flask routes. It has support for a configurable bac ...
随机推荐
- Python代码 注释
对某些代码进行标注说明,增加程序的可读性. 一.单行注释 以“#” 开头,#后面的所有东西都不会被运行 print("hello python") # 输出 `hello pyth ...
- Oracle中从控制文件读取的视图
Oracle中有一些数据字典视图需从控制文件中读取信息,如下所示.用户在数据库打开之前就可以访问这些视图,因为这些视图的内容存储在控制文件中. v$archived_log:归档日志信息,如大小,SC ...
- linux 系统命令和方法
1.EXPORT EXPORT 依赖库===============export LD_LIBRARY_PATH=/opt/export LD_LIBRARY_PATH=/usrlib/ 2.查看分区 ...
- 数据文件resize扩容
表空间不足 Alert日志报错 Mon Dec :: GMT+: Incremental checkpoint up to RBA[ox1af2d.3ddll.], current log tail ...
- 了解Git的工作区和暂存区
Git有工作区,暂存区之分. 1.工作区 我们电脑上的某个被Git管理的文件夹,就是一个工作区. 比如说我的GitWorkText文件夹,如图: 2.版本库(Repository) 在工作区有一个隐藏 ...
- 【02_258】Add Digits
Add Digits Total Accepted: 49702 Total Submissions: 104483 Difficulty: Easy Given a non-negative int ...
- camp待补
待修莫对 序列自动机 几何积分 沈阳 M 待删除背包 : 分组背包 K-LIS, K次二分(插到最后stop) 问题转化为LIS bzoj2131 hdu4055 最小线段覆盖环 实时路况 分治+f ...
- 20155219--pwd指令的简单实现
pwd指令的简单实现 pwd命令作用 Linux中用** pwd **命令来查看"当前工作目录"的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确 ...
- C语言--第0次作业评分和总结(5班)
作业链接http://www.cnblogs.com/ranh941/p/7496793.html 一.评分要求 *得分点1:建博客(5分) *得分点2:第0次作业(45分) **问题0:阅读推荐博客 ...
- Prime Test(POJ 1811)
素数判定的模板题,运用米勒-罗宾素数判定,然后用Pollard_Rho法求出质因数.使用相应的模板即可,不过注意存储质因子的数组需要使用vector,并且使用long long类型存储,不然存储不下, ...