MyWaf 和 MyIDS 面试准备
MyWaf
1. DSL
- 一个实例对应一个
Env变量,其中含有存放 URI、Headers、Body、Method、IP 的Map,存放函数名和对应方法的Map,存放威胁类型。 - 通过自旋锁来保证并发安全,因为执行传入的表达式会很快。
2. 正则表达式
- https://github.com/dwisiswant0/pcregexp
项目中所使用的正则表达式三方库:


编译Compile()正则表达式时,根据不同的表达式,其返回的Regexp结构体中其中之一的引擎/对象被初始化。 - 接着深入,这个库的
PCRE引擎底层调用的官方PCRE2库,不过为了不用CGO,引入purego库,通过在运行期更具不同 OS 挂载不同的库。



3. HTTP 解析
- 通过 Go 的
http.Request对象,获取元数据并转换成 URI、Headers、Body、Method、IP 等相关信息,同时做 URL 解码和实体字符转义。
4. FalcoSidekick
- 学习官方 falco 事件的格式,定义对应的结构体,在 Waf 中是单独开了一个协程,批量发送 Falco 事件(其中有创建了一个协程池来并发发送事件)。


5. CVE 部分的识别
- 直接看图

MyIDS
1. 高并发
- 使用
ants协程池来完成分析、SSE 和 Prometheus 推送。 - 通过调用
automaxprocs库的方法,用于解决 Go 程序在容器内无法正确识别运行环境中 CPU 核心数的问题。
https://blog.csdn.net/EDDYCJY/article/details/120984666
2. 云原生可观测
- Prometheus:通过使用 Prometheus Golang 库,根据不同的攻击类型定义,参照 Prometheus 的指标类型,定义
Counter和CounterVec。
通过原生 HTTP 注册服务,对 Prometheus 暴露/metrics接口。 - FalcoSidekick 在 MyWaf 中。
- ZincSearch:参照官方文档,将统计的数据发送到 ZincSearch 指定路径。
3. 配置解析
- 通过结构体 +
validate关键字做配置解析。
https://endlessshw.top/Golang/TelerWaf/面试准备/