必须将Laravel限流触发事件与原始请求上下文绑定记录,配置独立的'throttle'日志通道,重写ThrottleRequests中间件handle方法记录IP、URL和脱敏UA,再通过grep、awk等命令提取攻击特征生成CSV审计报告。

要精准识别暴力破解账号、高频扫描接口或恶意爬虫行为,必须把Laravel限流触发事件与原始请求上下文绑定记录,不能只依赖中间件默认日志——它不带IP归属地、User-Agent指纹和失败参数快照。
配置限流触发日志通道
在 config/logging.php 的 'channels' 数组中新增名为 'throttle' 的 daily 通道,driver 设为 'daily',path 指向 storage/logs/throttle.log,保留30天日志。
关键点:该通道【必须独立于 default 通道】,否则会被 debug/info 日志淹没,无法快速筛选限流事件。
执行 php artisan config:clear 清除配置缓存,否则新通道不生效。
拦截并记录被限流的请求
在 app/Http/Middleware/ThrottleRequests.php 中重写 handle 方法,在调用 parent::handle() 前插入日志逻辑:
方法一:直接写入日志(轻量级)
获取 $request->ip()、$request->fullUrl()、$request->header('User-Agent'),用 Log::channel('throttle')->warning() 记录,消息格式为 "[THROTTLE] {IP} 触发 {KEY} 限流,URL: {URL}"。
方法二:异步写入+脱敏(生产推荐)
使用 Log::channel('throttle')->warning() 时,对 User-Agent 做截断(保留前100字符),对 query 参数中的 password、token 字段统一用 *** 替换;避免日志文件暴露敏感信息。
【注意:不要在 handle 中调用 $request->all() 或 $request->getContent()】——这会消耗输入流,导致后续控制器收不到请求体数据。
提取攻击特征并生成审计报告
第一步:从 throttle.log 中提取近24小时全部限流记录
用 grep -E '\[THROTTLE\]' storage/logs/throttle.log | tail -n 5000 > /tmp/throttle_raw.log 导出原始数据。
第二步:按 IP 聚合频次
awk '{print $3}' /tmp/throttle_raw.log | sort | uniq -c | sort -nr | head -20 > /tmp/top_ips.txt
第三步:关联 IP 归属地与 User-Agent 分布
用 geoiplookup 工具查 top_ips.txt 中每个 IP 的国家/地区;再用 awk -F'\"' '{print $2}' /tmp/throttle_raw.log | sort | uniq -c | sort -nr | head -10 统计高频 UA。
第四步:输出结构化报告
将上述结果合并为 CSV:IP,次数,国家,Top-UA,保存为 audit_throttle_$(date +%Y%m%d).csv。


















