php防止网站被攻击的应急代码


Posted in PHP onOctober 21, 2015

前不久一个网站竟然被攻击,数据库被刷掉了,幸好客户机器上有数据库备份。遇到这么严重的问题,必须抓紧找出漏洞,防止再次被攻击。各方面检查之后发现除了服务器需要设置正确之外,其他无从下手,只好从ip地址上来解决这种攻击的问题。

如果发现某个ip访问网站太频繁了就加入到黑名单禁止访问,这不是一个很好的办法,但情急之下向不更好的解决方式,只是权宜之计,以后再进行深入的研究一下。

这个方法总结为一句话就是:通过禁止IP频繁访问防止网站被防攻击

<?php 
header('Content-type: text/html; charset=utf-8'); 
$ip=$_SERVER['REMOTE_ADDR'];//获取当前访问者的ip 
$logFilePath='./log/';//日志记录文件保存目录 
$fileht='.htaccess2';//被禁止的ip记录文件 
$allowtime=60;//防刷新时间 
$allownum=5;//防刷新次数 
$allowRefresh=120;//在允许刷新次数之后加入禁止ip文件中 
 
if(!file_exists($fileht)){ 
  file_put_contents($fileht,''); 
} 
$filehtarr=@file($fileht); 
if(in_array($ip."\r\n",$filehtarr)){ 
  exit('警告:你的IP已经被禁止了!'); 
} 
//加入禁止ip 
$time=time(); 
$fileforbid=$logFilePath.'forbidchk.dat'; 
if(file_exists($fileforbid)){ 
  if($time-filemtime($fileforbid)>30){ 
    @unlink($fileforbid); 
  }else{ 
    $fileforbidarr=@file($fileforbid); 
    if($ip==substr($fileforbidarr[0],0,strlen($ip))){ 
      if($time-substr($fileforbidarr[1],0,strlen($time))>120){ 
        @unlink($fileforbid); 
      }else if($fileforbidarr[2]>$allowRefresh){ 
        file_put_contents($fileht,$ip."\r\n",FILE_APPEND); 
        @unlink($fileforbid); 
      }else{ 
        $fileforbidarr[2]++; 
        file_put_contents($fileforbid,$fileforbidarr); 
      } 
    } 
  } 
} 
//防刷新 
$str=''; 
$file=$logFilePath.'ipdate.dat'; 
if(!file_exists($logFilePath)&&!is_dir($logFilePath)){ 
  mkdir($logFilePath,0777); 
} 
if(!file_exists($file)){ 
  file_put_contents($file,''); 
} 
$uri=$_SERVER['REQUEST_URI'];//获取当前访问的网页文件地址 
$checkip=md5($ip); 
$checkuri=md5($uri); 
$yesno=true; 
$ipdate=@file($file); 
foreach($ipdate as $k=>$v){ 
  $iptem=substr($v,0,32); 
  $uritem=substr($v,32,32); 
  $timetem=substr($v,64,10); 
  $numtem=substr($v,74); 
  if($time-$timetem<$allowtime){ 
    if($iptem!=$checkip){ 
      $str.=$v; 
    }else{ 
      $yesno=false; 
      if($uritem!=$checkuri){ 
        $str.=$iptem.$checkuri.$time."\r\n"; 
      }else if($numtem<$allownum){ 
        $str.=$iptem.$uritem.$timetem.($numtem+1)."\r\n"; 
      } 
      else{ 
        if(!file_exists($fileforbid)){ 
          $addforbidarr=array($ip."\r\n",time()."\r\n",1); 
          file_put_contents($fileforbid,$addforbidarr); 
        } 
        file_put_contents($logFilePath.'forbided_ip.log',$ip.'--'.date('Y-m-d H:i:s',time()).'--'.$uri."\r\n",FILE_APPEND); 
        $timepass=$timetem+$allowtime-$time; 
        exit('警告:不要刷新的太频繁!'); 
      } 
    } 
  } 
} 
if($yesno){ 
  $str.=$checkip.$checkuri.$time."\r\n"; 
} 
file_put_contents($file,$str);

以上就是本文的全部内容,希望对大家学习有所帮助。

PHP 相关文章推荐
PHP 冒泡排序算法的实现代码
Aug 08 PHP
php字符串分割函数explode的实例代码
Feb 07 PHP
php调用MySQL存储过程的方法集合(推荐)
Jul 03 PHP
CentOS安装php v8js教程
Feb 26 PHP
PHP中应该避免使用同名变量(拆分临时变量)
Apr 03 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
yii2.0实现pathinfo的形式访问的配置方法
Apr 06 PHP
Laravel与CI框架中截取字符串函数
May 08 PHP
CodeIgniter 完美解决URL含有中文字符串
May 13 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
Sep 11 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
Oct 10 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 PHP
PHP统计当前在线用户数实例讲解
Oct 21 #PHP
php精确的统计在线人数的方法
Oct 21 #PHP
为你总结一些php信息函数
Oct 21 #PHP
深入理解PHP变量的值类型和引用类型
Oct 21 #PHP
为你总结一些php系统类函数
Oct 21 #PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 #PHP
使用xampp搭建运行php虚拟主机的详细步骤
Oct 21 #PHP
You might like
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
详解thinkphp中的volist标签
2018/01/15 PHP
浅析Prototype的模板类 Template
2011/12/07 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
详解js访问对象的属性和方法
2018/10/25 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
python中stdout输出不缓存的设置方法
2014/05/29 Python
python实现基本进制转换的方法
2015/07/11 Python
Python动刷新抢12306火车票的代码(附源码)
2018/01/24 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
python使用Tesseract库识别验证
2018/03/21 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
Python如何重新加载模块
2020/07/29 Python
python能做哪些生活有趣的事情
2020/09/09 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
优秀共产党员演讲稿
2014/09/04 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
《观潮》教学反思
2016/02/17 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫