PHP实现限制IP访问及提交次数的方法详解


Posted in PHP onJuly 17, 2017

本文实例讲述了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;
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用Socket发送电子邮件
Oct 09 PHP
php访问查询mysql数据的三种方法
Oct 09 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
Jan 18 PHP
mysql_num_rows VS COUNT 效率问题分析
Apr 23 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
Dec 16 PHP
php内嵌函数用法实例
Mar 20 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
Sep 11 PHP
Yii2实现UploadedFile上传文件示例
Feb 15 PHP
laravel 中如何使用ajax和vue总结
Aug 16 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 PHP
php探针使用原理和技巧讲解
Sep 17 PHP
PHP提取字符串中的手机号正则表达式怎么写
Jul 17 #PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 #PHP
PHPstorm快捷键(分享)
Jul 17 #PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 #PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 #PHP
Laravel网站打开速度优化的方法汇总
Jul 16 #PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 #PHP
You might like
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
Smarty模板变量调节器用法分析
2016/05/23 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
JavaScript XML操作 封装类
2009/07/01 Javascript
类似CSDN图片切换效果脚本
2009/09/17 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
vue弹窗组件的实现示例代码
2018/09/10 Javascript
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
Python中设置变量访问权限的方法
2015/04/27 Python
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
HTML5播放实现rtmp流直播
2020/06/16 HTML / CSS
eVitamins日本:在线购买折扣维生素、补品和草药
2019/04/04 全球购物
班长竞选演讲稿
2014/04/24 职场文书
减负增效提质方案
2014/05/23 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
向女朋友道歉的话
2015/01/20 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
vue 实现上传组件
2021/05/31 Vue.js
MySQL为id选择合适的数据类型
2021/06/07 MySQL
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
Nginx反向代理、重定向
2022/04/13 Servers
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技