如何在Go语言环境中为攻击检测防火墙添加攻击时长统计并同步至Discord Webhook
实现攻击时长统计的解决方案
针对你的需求,我们可以利用Go标准库中的time包实现秒表功能,同时兼顾并发安全(避免多协程处理时的竞态问题),具体方案如下:
1. 定义全局状态变量
首先在你的Go代码中添加全局变量,用来记录攻击开始时间和攻击活跃状态,配合互斥锁保证并发安全:
import ( "sync" "time" // 保留你原有的其他导入包,比如fmt、os/exec、strconv等 ) // 存储攻击开始时间 var attackStartTime time.Time // 标记当前是否有攻击正在进行,防止重复启动秒表 var attackActive bool // 互斥锁,保护上述变量的并发读写 var startTimeMutex sync.Mutex
2. 修改攻击检测触发的代码
在触发攻击开始的Webhook时,记录当前时间并标记攻击为活跃状态:
fmt.Println("Rlimit Final", rLimit) // 加锁修改状态,避免并发冲突 startTimeMutex.Lock() if !attackActive { attackStartTime = time.Now() attackActive = true } startTimeMutex.Unlock() // 原有的启动Webhook代码保持不变 cmd := exec.Command("php", "start.php", strconv.Itoa(reqs), strconv.Itoa(rps), strconv.Itoa(requested), strconv.Itoa(passedcaptcha), "ONLINE", "200", "FIREWALL") cmd.Run()
3. 修改攻击结束检测触发的代码
在检测到攻击结束时,计算攻击持续时长,将其作为参数传给结束Webhook,并重置攻击状态:
if rps <= 20 && mitigation != 0 { startTimeMutex.Lock() durationSeconds := 0 if attackActive { // 计算从攻击开始到当前的秒数 duration := time.Since(attackStartTime) durationSeconds = int(duration.Seconds()) // 重置攻击状态,为下一次攻击做准备 attackActive = false } startTimeMutex.Unlock() // 将时长参数添加到end.php的调用参数中(注意调整PHP脚本接收这个新参数) cmd := exec.Command("php", "end.php", strconv.Itoa(totalreqs), strconv.Itoa(largerNumber), strconv.Itoa(totalver), strconv.Itoa(passedcaptcha), "ONLINE", "200", "FIREWALL", strconv.Itoa(durationSeconds)) cmd.Run() }
4. 配套调整PHP脚本
你需要修改end.php文件,新增对最后一个参数(攻击时长秒数)的接收逻辑,并将该数据包含到发送给Discord的Webhook消息内容中。比如在PHP里可以通过$argv[8]获取这个时长值(因为前面有8个原有参数,索引从0开始的话是第8位)。
扩展:多攻击场景支持
如果你的防火墙需要同时处理多个独立攻击(比如不同IP来源的攻击),可以将全局变量改为map结构,用攻击标识(如源IP)作为key来记录每个攻击的开始时间:
var attackStartTimes = make(map[string]time.Time) var timesMutex sync.Mutex // 攻击开始时(假设你能获取到攻击源IP) timesMutex.Lock() attackStartTimes[attackSourceIP] = time.Now() timesMutex.Unlock() // 攻击结束时(根据IP获取对应开始时间) timesMutex.Lock() startTime, exists := attackStartTimes[attackSourceIP] durationSeconds := 0 if exists { duration := time.Since(startTime) durationSeconds = int(duration.Seconds()) // 删除已结束的攻击记录 delete(attackStartTimes, attackSourceIP) } timesMutex.Unlock()
这样就能实现对多个独立攻击的时长统计了。
内容的提问来源于stack exchange,提问作者vpnk
相关产品推荐
相关产品推荐

