You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 21:32:30