PHP、.htaccess、DDoS 和快速请求保护

2024-01-05

我有一个问题,我构建了这个小脚本来检查某个 ip 是否淹没了我的网站。 当它出现时,我会拒绝 .htaccess 文件中的 IP。我的问题是,有人可以告诉我这个脚本是否完全无用或值得尝试...该脚本在配置文件中调用,因此它在每个页面加载时运行。

<?php
#get the visitor ip
$ip = $_SERVER["REMOTE_ADDR"];

#start the session
@session_start();

#check if the ip is banned
if( $_SESSION['~b'] ){

#check if we can open htaccess
$fp = @fopen('./.htaccess','a'); 
    if($fp){
        #add the ip to htaccess
        @fwrite($fp,"\r\ndeny from $ip"); 
        #close
        @fclose($fp);
        #destroy the session
        @session_destroy();
        @mail("my-email","IP Banned","Ip: $ip");
    }
    #let the user know why we deny him or her access
    die('To many requests.');
    }
#get the filename and location
$f = './log/'.@ip2long($ip);

#check if the file exists
if ( @is_file($f) ) {
        #get the last filetime
        $a = @filemtime($f);
        #touch the file, give a new filetime
        @touch($f,time());
        #the ip is not banned
        $_SESSION['~b']  = false;
        #add the time diff
        $_SESSION['~r'] += @time()-$a;
        #add the latest hit
        $_SESSION['~h'] += 1;
    }else{
        #create the file if it doesn't exist
        @file_put_contents($f,''); #size: 0kb
        #if touch() doesn't work
        #chmod($ipfile,0755); 
    }

#calculate the diff after 10 hits, and ban when the avg is smaller than 0.25 seconds
if( $_SESSION['~h'] > 10 && ($_SESSION['~r']/$_SESSION['~h']) < 0.25 ) $_SESSION['~b'] = true;
?>

只是遵循避免会话的建议,所以我将其基于文件,而不必依赖 cookie 和会话:

<?php
# get the visitor ip
$i = $_SERVER["REMOTE_ADDR"];
# get the filename and location
$f = './log/'.ip2long($i).'.dat';
# check if the file exists and we can write
if ( is_file($f) ) {
    # get the last filetime
    $a = filemtime($f);
    # get the file content
    $b = file_get_contents($f);
    # create array from hits & seconds
    $d = explode(':',$b);
    # calculate the new result
    $h = (int)$d[0] + 1;
    $s = (int)$d[1] + (time()-$a);  
    # add the new data tot text file
    file_put_contents($f,"$h:$s",LOCK_EX);
    unset($d);
}else{
    # create the file if it doesn't exist hits:seconds
    file_put_contents($f,"1:1",LOCK_EX); #size: 3kb
    # to make sure we can write
    # chmod($f,0755); 
    # set the hits to zero
    $h = 0;
}
# create a result var
$r = $h > 10 ? (float)$s/$h : (float)1;
# calculate the diff after 10 hits, and ban when the avg is smaller than 0.20 seconds (5 hits per second)
if( $r < 0.20 ) {
    # check if we can open htaccess
    $fp = @fopen('./.htaccess','a'); 
    if($fp){
        # add the ip to htaccess
        @fwrite($fp,"\r\ndeny from $i"); 
        # close
        @fclose($fp);
        # mail the admin
        @mail("email","IP Banned","Ip: $i with $r sbh (Seconds Between Hits)");
    }
    # let the user know why we deny him or her access
    die('To many requests.');
    # remove the file
    unlink($f);
}
# if the user leaves, reset
if( $r > 30 ) {
    unlink($f);
}
echo 'Result: '.$r.'sbh (Seconds Between Hits)';
?>

如果你想阻止临时用户在一定时间内发送太多请求,那么yes,该脚本可以工作。打开验证码屏幕,您就可以开始工作了。

BUT

真正的答案是no.

此代码的主要错误是根据会话来确定用户活动的频率。一个“好”的攻击者可以用禁用 cookie 的请求淹没您的服务器,并欺骗他/她的 IP。

阻止攻击的一种方法是进入服务器级别并安装 iptables。事实上,大多数 Linux 发行版都附带了 iptables。它需要很少的配置并且开箱即用。

另一种方法是,如果您拥有服务器的 root 访问权限,则可以将会话处理移至 Memcached。它有一个功能叫防洪,相当BOSS。

防止 DDOS 的另一种途径是通过第三方服务,例如 块多斯http://www.blockdos.net/ http://www.blockdos.net/

有点贵,但它可能对你有用。

但 PHP 本身无法配置为处理 DDOS 攻击。在进入 PHP 脚本之前,您需要在所有要审查的请求之前放置某种设备或防火墙。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP、.htaccess、DDoS 和快速请求保护 的相关文章

  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • PHP MYSQL文件内容转义问题

    我正在尝试使用 php 将 pdf 文件上传到 mysql 数据库中 除了文件内容之外 一切都很好 无论我如何尝试转义特殊字符 查询总是失败 主要是 未知命令 n 我使用过addslashes mysql real escape strin
  • 如果遵循 REST 架构,如何访问 codeigniter 中的 URL 参数?

    以下是可用于访问资源的基于 REST 的有效 URL 使用codeigniter 如何访问下面传递的参数1 我在教程中看到了上述内容并设置了我的代码 然而显然 id this gt input gt get id 不起作用 Using th
  • 正则表达式将从文本文件中提取句子

    我需要一个正则表达式来从文本文件中提取句子 示例文本 以 2004 年底发生的亚洲海啸灾难为例 对 Google 新闻 http news google com 的查询在一个月内 1 月 17 日 返回了超过 80 000 篇有关该事件的在
  • PHP设置全局环境变量的方法

    我已阅读问题 答案here https stackoverflow com questions 13568191 how to get system environment variables into php while running
  • 在 Laravel 中将自定义/新类文件放在哪里?

    我有关于如何使用 Yelp Fusion API 的 PHP 示例 它用OAuth php file https github com Yelp yelp api blob master v2 php lib OAuth php有几个班级
  • mongodb从不同数据库中选择

    我有大约 200 个 mongodb 数据库 每个数据库都有一个名为 Group 的集合 在该集合中有一个名为 meldingId 的字段 是否可以进行一个 mongodb 查询来查找不同数据库中的所有值 我设法通过 selectDB da
  • 在 PHP 中重新定义常量

    是否可以在 php 中重新定义由define功能 我有一个包含多个常量的类 其中包含用户数据 我正在尝试为多个用户使用该类 define ALLEGRO ID id define ALLEGRO LOGIN login define ALL
  • 简单搜索:使用 CodeIgniter 将表单变量传递到 URI

    我的每个页面上都有一个搜索表单 如果我使用表单助手 它默认为 POST 我希望搜索词显示在 URI 中 http example com search KEYWORD 我已经在谷歌上搜索了大约一个小时 但没有结果 我只找到了有关如何进行的文
  • yii2 无线电内联 Html 帮助器

    我在 yii2 中有这个 radioList Html radioList abc null new class gt form control input sm 它生成这个 div class radio 但我想要 div class r
  • PHP 的同义词库类或 API [编辑]

    TL DR 摘要 我需要一个命令行应用程序 我可以用它来获取同义词和其他相关单词 它需要是多语言的并且跨平台工作 任何人都可以为我推荐一个合适的程序 或者帮助我使用我已经找到的程序吗 谢谢 更长的版本 我的任务是用 PHP 编写一个系统 该
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • javascript 和 PHP 中的正则表达式有什么区别吗?

    这是在 javascript 中验证电子邮件地址的正则表达式 我不确定是否可以直接在 PHP 中使用它 a z d u00A0 uD7FF uF900 uFDCF uFDF0 uFFEF a z d u00A0 uD7FF uF900 uF
  • Laravel 验证规则仅针对字母

    我正在尝试添加验证规则以仅接受信件 我正在使用regex规则 但它仍然不起作用 下面是我的代码 Validate request input this gt validate request name gt required regex p
  • 如何在 PHP 中使用 file_get_contents 获取图像的 MIME 类型

    我需要获取图像的 MIME 类型 但我只有图像的正文file get contents 是否有可能获取 MIME 类型 是的 你可以这样得到它 file info new finfo FILEINFO MIME TYPE mime type
  • 在 WooCommerce 管理订单项目上显示产品自定义字段(也适用于可变产品)

    基于在 WooCommerce 的订单编辑页面上显示自定义字段 https stackoverflow com questions 56259910 show custom fields on the order editing page
  • PhpPresentation imagecreatefromstring():数据不是可识别的格式 - PHP7.2

    我正在尝试使用 PhpPresentation 来阅读sample pptx使用文档中为读者提供的简单说明进行文件处理 我得到 imagecreatefromstring Data is not in a recognized format
  • htaccess mod-重写子域

    我使用以下命令将通配符子域重定向到相应的文件夹 RewriteCond REQUEST URI users NC RewriteCond HTTP HOST domain com NC RewriteCond 1 www NC Rewrit
  • 自动生成PHP代码的策略?

    我正在开发一个框架 在后端创建 ER 图后 该框架可以动态地对自身的各个部分进行编程 作为一名 PHP 新手 我想知道是否还有比打开一个纯 xyz php 文本文件然后将动态生成的代码添加到该文件更奇特的事情 是的 尝试一下Zend Cod
  • 使用 Laravel 4 验证多个文件上传

    如何在 Laravel 4 中验证上传文件的数组 我已将其设置为允许多个文件 并且已测试这些文件是否存在于 Input file files 数组中 但如何验证每个文件呢 这是我尝试过的 notesData array date gt In

随机推荐

  • Excel中如何将长表格转换为宽表格?

    一张图片胜过千言万语 假设在一张纸中我有下表 使用这些信息 我想以编程方式在另一张纸中生成这样的表格 有点将长表格分解为宽表格 你怎样才能做到这一点 使用VBA Range G1 K99 Clear For Each xx In Range
  • MapActivity 中的 SherlockActionBar

    我在整个应用程序中广泛使用 Sherlock Action Bar 但我有一个继承自 MapActivity 的活动 因此我无法使其继承自 SherlockActivity 有什么方法可以利用地图中的 Sherlock 操作栏来自定义它吗
  • 在 SQL Server 中将标识列重置为零?

    如何在 SQL Server 中将表的 Identity 列重置为零 Edit 我们如何使用 LINQ to SQL 来做到这一点 DBCC CHECKIDENT MyTable RESEED NewValue 您还可以执行截断表 但是 当
  • += 事件运算符

    public void Bar Foo foo new Foo foo MyEvent foo MyEvent foo FireEvent void foo MyEvent object sender EventArgs e Foo sen
  • Spring Security 5 OAuth2客户端密码授予类型

    我有2个应用程序 Spring应用程序1是客户端和资源服务器 Spring应用程序2是授权服务器 用户将能够登录应用程序 1 并访问其资源 我想实现以下流程 用户在登录表单中输入他的凭据 gt 应用程序 1 将使用用户凭据及其密码从应用程序
  • MFC 中的国际化

    终于 经过多年的推迟 将我的应用程序本地化为英语以外的其他几种语言 第一个挑战是设计与我的 C MFC 应用程序的集成 该应用程序具有数十个对话框和无数字符串 我遇到了两种可能的替代实现 将本地化资源文件编译并部署为 DLL 提取所有字符串
  • PHPCS 未在命令行上运行?

    当我输入 phpcs version 时 我没有得到版本号 而是得到如下内容 Applications drupal php bin phpcs line 2 php No such file or directory Applicatio
  • 使用 PHP 解析 xml 文件的 simpleXML 替代方案

    我只是想知道是否有 simpleXML 的替代方案来使用 PHP 解析 XML 数据 例如 如果 simpleXML 模块未加载 或者即使存在比 SimpleXML 性能更好的库 类 显然有处理 XML 的多种不同方式 http docs
  • 10.3 中包含 javax.servlet 的 WebLogic Jar 在哪里?

    我正在尝试配置我的路径以将 javax servlet 包含在 WebLogic 中 WebLogic 已拆分出 Jar 文件 那么哪一个包含 javax servlet 从 WebLogic 10 开始 BEA 外部化了 API 规范的实
  • 查找 GZIP 文件内的文件大小

    有没有办法找出java中GZIP文件内原始文件的大小 例如 我有一个 15 MB 的文件 a txt 它已被 GZipped 为 3MB 大小的 a gz 我想知道 a gz 中存在的 a txt 的大小 而不需要解压缩 a gz 除了压缩
  • 如何为 Django 设置 Jupyter/IPython Notebook?

    我一直在使用中描述的方法这个帖子 https andrewbrookins com python using ipython notebook with django 用于设置 IPython Notebook 以与 Django 很好地配
  • websocket 是否仅适用于浏览器

    我正在尝试使用第 3 方库编写本机 Objective C 和本机 Android 应用程序 我已经选择了图书馆并且我已经在这方面取得了进展 我团队中的一个人认为 目前 websocket 的实现主要集中在 Web 浏览器上 如果我们使用这
  • Java 中的格式化打印

    我有这个代码 public String toString Day day String s day getDayName day toString return s 这是 Day 类的 toString 方法 public String
  • 根据列值是否在另一列中将列添加到 PySpark DataFrame

    我有一个 PySpark DataFrame 其结构为 u1 1 1 2 3 u1 4 1 2 3 toDF user item fav items 我需要添加另一列 1 或 0 具体取决于 item 是否在 fav items 中 所以我
  • 禁用所有库的日志消息

    我想记录来自我的程序的消息 而不是来自它使用的库的消息 我可以禁用 更改各个库的日志记录级别 如下所示 logging getLogger alibrary setLevel logging ERROR 问题是 我的程序使用了很多很多的库
  • InternetExplorerDriver 的注册表项 HKEY_LOCAL_MACHINE\...\FEATURE_BFCACHE 如何解决 Internet Explorer 11 问题?

    因此 我正在 IE11 中自动化一个 Web 应用程序 为政府合同欢呼三声 并且我按照 Selenium Wiki 上的说明来配置该东西 因为我们遇到了一堆奇怪且不稳定的行为 我在这一步 它说我已经添加了一个注册表项来帮助维护驱动程序和浏览
  • 通过将属性设置为 nil 在 Swift 中再次触发惰性初始化程序

    我想要一个延迟初始化的属性 如果我将属性设置为 nil 我可以再次调用其初始化程序 如果我这样定义我的财产 lazy var object init code 然后调用该属性 初始化程序被触发一次 但是 如果我设置object稍后在我的程序
  • Android - 将图像保存在特定文件夹中

    我需要将使用我的应用程序拍摄的照片保存在特定文件夹中 我已经阅读了这个问题的许多解决方案 但我无法使它们中的任何一个起作用 所以我寻求帮助 MainActivity java public void onClick View v Inten
  • Gnuplot:线条不透明度/透明度?

    我正在使用 Gnuplot 成功绘制一些时间序列数据 然而 该系列相当密集 大约 5 英寸的空间中有 10 000 个样本 当我绘制多个系列时 很难看到绘制在顶部的系列下面的内容 有什么方法可以使线条具有一点不透明度或透明度 即使线条透明
  • PHP、.htaccess、DDoS 和快速请求保护

    我有一个问题 我构建了这个小脚本来检查某个 ip 是否淹没了我的网站 当它出现时 我会拒绝 htaccess 文件中的 IP 我的问题是 有人可以告诉我这个脚本是否完全无用或值得尝试 该脚本在配置文件中调用 因此它在每个页面加载时运行