防止PHP脚本被淹没

2024-04-21

我想防止我的脚本被淹没 - 如果用户按 F5,它每次都会执行脚本。

我想防止这种情况并允许每 2 秒执行一个脚本,有什么解决方案吗?


您可以使用内存缓存来执行此操作..

简单的演示脚本

$memcache = new Memcache ();
$memcache->connect ( 'localhost', 11211 );
$runtime = $memcache->get ( 'floodControl' );

if ((time () - $runtime) < 2) {
    die ( "Die! Die! Die!" );
} 

else {
    echo "Welcome";
    $memcache->set ( "floodControl", time () );
}

这只是一个示例代码..还有其他需要考虑的事情,例如

一个更好的IP地址检测(Proxy、Tor)

B. 当前行动

C. 每分钟最大执行次数等...

D. 在最大洪水等之后禁止用户

编辑 1 - 改进版本

Usage

$flood = new FloodDetection();
$flood->check();

echo "Welcome" ;

Class

class FloodDetection {
    const HOST = "localhost";
    const PORT = 11211;
    private $memcache;
    private $ipAddress;

    private $timeLimitUser = array (
            "DEFAULT" => 2,
            "CHAT" => 3,
            "LOGIN" => 4 
    );
    private $timeLimitProcess = array (
            "DEFAULT" => 0.1,
            "CHAT" => 1.5,
            "LOGIN" => 0.1 
    );

    function __construct() {
        $this->memcache = new Memcache ();
        $this->memcache->connect ( self::HOST, self::PORT );
    }

    function addUserlimit($key, $time) {
        $this->timeLimitUser [$key] = $time;
    }

    function addProcesslimit($key, $time) {
        $this->timeLimitProcess [$key] = $time;
    }

    public function quickIP() {
        return (empty ( $_SERVER ['HTTP_CLIENT_IP'] ) ? (empty ( $_SERVER ['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER ['REMOTE_ADDR'] : $_SERVER ['HTTP_X_FORWARDED_FOR']) : $_SERVER ['HTTP_CLIENT_IP']);
    }

    public function check($action = "DEFAULT") {
        $ip = $this->quickIP ();
        $ipKey = "flood" . $action . sha1 ( $ip );

        $runtime = $this->memcache->get ( 'floodControl' );
        $iptime = $this->memcache->get ( $ipKey );

        $limitUser = isset ( $this->timeLimitUser [$action] ) ? $this->timeLimitUser [$action] : $this->timeLimitUser ['DEFAULT'];
        $limitProcess = isset ( $this->timeLimitProcess [$action] ) ? $this->timeLimitProcess [$action] : $this->timeLimitProcess ['DEFAULT'];

        if ((microtime ( true ) - $iptime) < $limitUser) {
            print ("Die! Die! Die! $ip") ;
            exit ();
        }

        // Limit All request
        if ((microtime ( true ) - $runtime) < $limitProcess) {
            print ("All of you Die! Die! Die! $ip") ;
            exit ();
        }

        $this->memcache->set ( "floodControl", microtime ( true ) );
        $this->memcache->set ( $ipKey, microtime ( true ) );
    }

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

防止PHP脚本被淹没 的相关文章

随机推荐

  • 如何测试模块的运行块

    我希望我的 AngularJS 应用程序发出 http 请求以从服务器检索用户信息或重定向到登录屏幕 我在应用程序主模块的运行块中实现了这一点 但是如何在运行块中测试代码呢 或者我应该将此初始化代码移到控制器中以使其可测试 我正在使用 Ka
  • 从 Excel 到 SQL Server 的数据导入无法导入所有数据

    我在使用导入和导出数据工具将数据从 Excel 导入到 SQL Server 时发生了一件奇怪的事情 缺点是我可以在Excel中看到数据 但所有数据都没有导入 我有一本 Excel 工作簿 其中包含一个电子表格 我可以看到列中的数据 一切看
  • 如果没有收到请求的响应,会发生什么情况?我看到重试

    我认为我遇到的问题可能更多是与浏览器相关的问题 但它是一个非常基本的问题 当我冒险构建一个 Web 应用程序时 我也想找到答案 在我的客户端代码中我正在做一个 ajax称呼 这篇文章可能需要一段时间才能回复 我看到的是在一段时间后再次发送请
  • 在选定的数据范围内创建数据分区,将其输入到 caret::train 函数中以进行交叉验证

    我想为下面的数据框创建折刀数据分区 这些分区将用于caret train 像caret groupKFold 产生 然而 问题是我想将测试点限制为超过 16 天 同时使用这些数据的其余部分作为训练集 df lt data frame Eff
  • 如何用Python为ElasticSearch创建只读客户端?

    我想从 ES 读取数据 但不想意外向其中写入数据 无索引操作 这只是一种安全措施 以便以后修改查询函数的其他人不允许插入数据 当你说你想要只读客户端时 客户端强调您系统中的同一集群可能有其他客户端 然后阻止整个索引为只读将会阻止所有客户端的
  • 在Linux上运行MFC程序

    我有一个相当大的基于 MFC 的程序 我的任务是让它在 Linux 上运行 我已经解释过 这需要将程序重新编写为带有 STL 的直接 C 更多工作 或者重新编写为 Qt C 更少工作 现在我被告知 我需要编写包装器以使每个 MFC 类在 L
  • 如何在 Jupyter 中启用 R 语法突出显示?

    我希望为 Jupyter 编写的 R 代码添加语法突出显示 准确地说 语法高亮超出了数字 文本等已有的语法高亮 我的设置 Packges 康达R 3 2 4 康达版本 4 0 6 Jupyter版本4 1 0 在带有 Chrome 的 Wi
  • 如何更改Exception对象的异常消息?

    所以我捕获了一个异常 Exception 类的实例 我想要做的是更改其异常消息 我可以得到这样的异常消息 e gt getMessage 但如何设置异常消息呢 这是行不通的 e gt setMessage hello 对于几乎所有的情况 您
  • SelectSingleNode 返回 null - 即使有命名空间

    我知道以前曾以类似的方式问过这个问题 但我似乎无法解决这个问题 我有一些 xml
  • 如何允许多个参数为空值

    我在 SSRS 报表生成器中的报表有多个参数 如果不需要选择 我希望所有参数都允许空白值 但是当我尝试运行报告时 第一个参数将允许空 空白值 并且它将提示我输入其余参数 有没有办法解决 Set Allow Blank Value and o
  • 如何遵守自制协议?

    我有一个带有委托属性的类 任何想成为代表的人都必须遵守协议 我这样定义一切 import
  • Android 调用另一个类的方法

    我知道这个问题重复了 但我在互联网上找不到答案 我想调用另一个类的方法 我有Class1和Class2 在第2类中我有这个方法 public void UpdateEmployee some code 我想从Class1调用上面的方法 感谢
  • 理解 scala 中参与者的线程性

    有人告诉我 Scala Actors 实际上从来不会同时执行两个操作 这表明 act 或 React 或 receive 方法本质上是同步的 我知道 act 方法中的长操作可能会导致阻塞问题 并且我假设对消息队列的访问必须以某种方式同步 但
  • Rails 路由中的“mount”指令是什么意思?

    我找不到关键字 mount 的含义轨道布线系统 http api rubyonrails org classes ActionDispatch Routing html 我已经设置了Mercury http jejacks0n github
  • 如何使用multiple属性在Android上上传多个文件?

    I got a
  • 在 python 上使用 TensorRT .engine 文件进行推理

    我使用 Nvidia 的迁移学习工具包 TLT 进行训练 然后使用 tlt converter 将 etlt 模型转换为 engine 文件 我想使用这个 engine 文件在 python 中进行推理 但由于我使用 TLT 进行训练 因此
  • 合并冲突后暂存区中有哪些文件?

    我运行时与 file1 txt 发生冲突git merge b2当前分支是master ls files somcdt file1 txt然后显示 M 100644 4111d50ada6cc03ec6079f226c23efa3142c9
  • 是否可以在 LLVM IR 代码中指定十六进制数?

    例如 error floating point constant invalid for type 3 and i8 0x80 2 从扫描的红外参考手册 http llvm org docs LangRef html simple cons
  • 从 Java 方法返回多个值:为什么没有 n 元组对象?

    为什么没有一个 标准的 Java 认证的 解决方案作为 Java 语言本身的一部分 从 Java 方法返回多个值 而不是开发人员必须使用自己的方法 例如映射 列表 对等 为什么Java不支持n元组对象 特别是考虑可能一起 串联 修改两个对象
  • 防止PHP脚本被淹没

    我想防止我的脚本被淹没 如果用户按 F5 它每次都会执行脚本 我想防止这种情况并允许每 2 秒执行一个脚本 有什么解决方案吗 您可以使用内存缓存来执行此操作 简单的演示脚本 memcache new Memcache memcache gt