TP8.0 接口被恶意刷量?采用滑动窗口算法实现精准限流防护

蓮花仙者

蓮花仙者

2026-07-11

958人浏览

原创

tp8.0项目需用滑动窗口限流防御恶意刷量,前提为启用redis扩展、配置可连通的redis连接、注册限流中间件;核心采用zset+lua脚本原子实现,按场景设置差异化key与窗口策略,并通过ab压测及日志验证生效。

tp8.0 接口被恶意刷量?采用滑动窗口算法实现精准限流防护

接口被恶意刷量导致服务器响应变慢、短信验证码被批量盗取、支付接口被反复试探,这些问题在TP8.0项目中必须立刻拦截——固定窗口限流在窗口切换瞬间允许双倍请求通过,根本挡不住有准备的攻击者。

确认滑动窗口限流的适用前提

第一步:检查当前TP8.0环境是否已启用Redis扩展。执行 php -m | grep redis,若无输出则需先安装 phpredis 扩展并重启PHP-FPM服务。

第二步:确认Redis连接配置已写入 config/cache.php 中的 redis 驱动项,且 hostportpassword(如有)全部可连通。【未验证Redis连通性就写Lua脚本,会导致限流逻辑完全不生效

第三步:确保目标接口已注册为中间件路由,例如在 app/middleware.php 中绑定 App\Middleware\RateLimitMiddleware::class 到对应路由组。

用ZSET实现滑动窗口计数(核心方案)

方法一:基于时间戳分片的ZSET存储

在Redis中为每个用户/IP生成唯一key,如 rate:login:192.168.1.100;每次请求时,以毫秒级时间戳为score,随机字符串为member,执行 ZADD key now randstr;再用 ZREMRANGEBYSCORE key 0 (now-1000) 清理1秒前的数据;最后 ZCARD key 获取当前窗口请求数。

方法二:使用Lua脚本原子执行(推荐)

将以下脚本保存为 sliding_window.lua

Redis 8.2.3
Redis 8.2.3

Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。

下载

local key = KEYS[1]
local window_ms = tonumber(ARGV[1])
local max_count = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
redis.call("ZREMRANGEBYSCORE", key, 0, now - window_ms)
local count = redis.call("ZCARD", key)
if count <br><code>  redis.call("ZADD", key, now, tostring(now) .. ":" .. math.random(1000,9999))
  redis.call("PEXPIRE", key, window_ms + 1000)
  return 1
else
  return 0
end

在TP8.0中间件中调用:$this->redis->eval(file_get_contents('sliding_window.lua'), [$key, 1000, 5, microtime(true)*1000]) —— 这里1000表示1秒窗口,5是阈值,单位毫秒时间戳保证精度。

按场景配置不同限流策略

登录接口:IP+手机号组合key,窗口10秒、阈值10次,防止暴力撞库。注意手机号需脱敏拼接,避免明文泄露风险。

短信发送接口:手机号单维度key,窗口60秒、阈值2次,同时叠加图形验证码前置校验。

支付回调接口:商户号+订单号复合key,窗口300秒、阈值1次,防重放攻击——【此处必须开启幂等性校验,仅限流不能替代业务层去重

验证限流是否生效

用ab命令压测:ab -n 20 -c 10 "http://yourdomain.com/api/login",观察返回状态码分布。正常应出现部分429响应。

手动检查Redis:redis-cli zrange rate:login:127.0.0.1 0 -1 WITHSCORES,确认ZSET中只有最近1秒内的成员。

查看TP8.0日志:runtime/log/202607/07_rate_limit.log,搜索关键词“rejected_by_sliding_window”,确认拦截记录持续写入。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis thinkphp

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

2771

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

2171

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3366

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

160

15

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

2471

4

Qt Creator按钮响应设置方法
Qt Creator按钮响应设置方法

信号槽是 Qt 开发的核心机制。本专题整理 Qt Creator 中按钮点击、菜单触发、输入变化、窗口事件、自定义信号、自动连接槽函数和手动 connect 写法,帮助用户理解界面控件如何和 C++ 代码联动。

2026.08.05

0

10

Qt Creator新建项目使用教程
Qt Creator新建项目使用教程

本专题整理 Qt Creator 新建项目、打开已有工程、项目模板选择、目录结构、源文件管理、构建目录、运行配置和项目迁移方法,重点解决新手不知道选 qmake 还是 CMake、项目打不开、文件不参与编译等常见问题。

2026.08.05

0

10

maven常用插件使用大全
maven常用插件使用大全

PHP中文网精心整理Maven主流插件用法合集,涵盖编译、测试、打包等常用插件使用大全。从基础配置到进阶实战,详细解析各插件功能与适用场景,助你轻松掌握Maven自动化构建,解决Java项目开发痛点,是开发者必备的实用指南。

2026.08.05

0

31

PyCharm快速入门指南
PyCharm快速入门指南

本专题汇总了PyCharm快速入门的全套指南与教程,涵盖从官网下载安装、创建第一个Python项目、配置虚拟环境,到代码编辑、运行调试等基础操作,并整理了版本控制(Git)集成、常用高效快捷键及实用插件等进阶技巧,助你快速上手这款高效的Python IDE。

2026.08.05

2

17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 9万人学习