Security Go — 攻击检测库

Security Go — 攻击检测库

English

Go 语言编写的攻击检测包,覆盖 32 个检测器5 大攻击类别3 种可插拔存储后端。统一接口 + 注册表模式,纯检测库,适配任何 Go HTTP 框架。

设计思路

核心原则

  • 零依赖检测 — 所有检测器仅使用 Go 标准库 regexp,无外部依赖
  • 统一接口 — 每个检测器实现 Detector 接口(Name() + Detect()),通过 Engine 注册表统一管理
  • 预编译正则 — 所有模式在 var 初始化时编译,运行时零开销
  • 按需配置 — 注入/协议/数据/文件检测器即插即用;HTTP 校验器需应用自定义配置

    设计架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
                      ┌───────────────────────────────┐
│ security.Engine │
│ ┌─────────────────────────┐ │
│ │ Detector Registry │ │
│ │ map[string]Detector │ │
│ └─────────────────────────┘ │
│ │
│ Detect(name, input) │
│ DetectAll(input) │
│ DetectRequest(*http.Request) │
└──────────────┬────────────────┘

┌─────────────────┬───────────┴───────────┬─────────────────┐
│ │ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌────────────▼────────┐ ┌───▼───────────┐
│ injection │ │ protocol │ │ data │ │ file │
│ (10 个) │ │ (9 个) │ │ (5 个) │ │ (3 个) │
│ │ │ │ │ │ │ │
│ xss, sql, │ │ ssrf, xxe, │ │ deser, csv, │ │ traversal, │
│ command, │ │ header, │ │ mail, jwt, │ │ upload, │
│ nosql, │ │ host, │ │ proto_poll │ │ data_leak │
│ ldap, │ │ smuggling, │ │ │ │ │
│ xpath, │ │ redirect, │ │ │ │ │
│ jndi, ssi, │ │ cors, ws, │ │ │ │ │
│ graphql, │ │ dns_rebind │ │ │ │ │
│ ssti │ │ │ │ │ │ │
└─────────────┘ └─────────────┘ └─────────────────────┘ └───────────────┘

┌───────────────────────────────────────────────────────────────┤
│ │
┌──────▼──────────┐ ┌──────────▼──────────┐
│ httpval │ │ storage │
│ (5 个) │ │ ┌──────────────┐ │
│ │ │ │ Backend │ │
│ method, size, │ │ │ interface │ │
│ type, csrf, │ │ └──┬───┬───┬───┘ │
│ ip_blacklist │◄────── 使用 storage.Backend ──────────►│ Memory File Redis │
│ (需配置参数) │ │ │
└─────────────────┘ └────────────────────┘

数据流

1
2
3
4
5
6
7
8
9
HTTP Request


┌──────────────┐ ┌─────────────────┐ ┌──────────────┐
│ collectInputs│────▶│ DetectAll() │────▶│ []*Result │
│ URL, Query, │ │ 逐个检测器调用 │ │ 聚合结果 │
│ Headers, │ │ Detect(input) │ │ │
│ Cookies │ └─────────────────┘ └──────────────┘
└──────────────┘

严重程度分级

级别 说明 典型场景
SeverityLow 低风险 非法 HTTP 方法、Content-Type 不匹配
SeverityMedium 中风险 CORS 配置问题、开放重定向、GraphQL 内省
SeverityHigh 高风险 XSS、SQL 注入、SSRF、路径遍历
SeverityCritical 严重 命令注入、JNDI、SSTI、XXE、数据泄露

实现功能

注入类攻击 (10)

检测器 检测模式
XSS <script>on[a-z]+= 事件处理器、javascript: 伪协议、SVG/CSS 注入、eval()document.cookie
SQL 注入 UNION SELECT(含 /**/ 绕过)、sleep/benchmark/pg_sleep、布尔盲注、information_schema 枚举、xp_cmdshell
命令注入 反引号、$()、管道符、/dev/tcp、PHP system/exec/shell_exec、链式执行 && ; `\ \ `
NoSQL 注入 MongoDB $ne $gt $regex $where 操作符、$func、JSON 键注入
LDAP 注入 过滤操作符 `(\ (&(!objectClass=*`、URL 编码绕过
XPATH 注入 布尔绕过 ' or '1'='1string-length()count()
JNDI/Log4Shell ${jndi:ldap://${lower:j} 混淆、${env:} 环境变量、ldap/rmi/dns 协议
SSI 注入 <!--#exec cmd=<!--#include file=<!--#echo var=
GraphQL 注入 __schema/__type 内省、深度嵌套 DoS(5层+)、mutation 检测
SSTI Jinja2 {{}}、FreeMarker ${}、ERB <% %>、Python MRO 遍历、config/self 访问

协议与请求攻击 (9)

检测器 检测模式
SSRF 内网 IP(127/10/172.16/192.168)、169.254.169.254、IPv6 loopback、gopher/dict/file/ftp 协议
XXE <!ENTITY SYSTEM/PUBLIC、参数实体 %entity;、DOCTYPE 声明
HTTP 头注入 CRLF %0d%0a / \r\n、Set-Cookie/Location/Content-Length 注入
Host 头攻击 CRLF Host 注入、X-Forwarded-HostX-Original-URL 投毒
请求走私 Transfer-Encoding/Content-Length 不一致、双重 TE 头、\x0b 折叠头混淆
开放重定向 //evil.com 协议相对 URL、javascript:/data: 伪协议
CORS 绕过 Origin: nullAccess-Control-Allow-* 头注入
WebSocket 劫持 Upgrade 头注入、null Origin 绕过、ws:// URL
DNS 重绑定 Host 头内网 IP、localhost、无 TLD 短主机名

HTTP 协议层校验 (5)

检测器 说明
HTTP 方法 仅允许 GET/POST/PUT/DELETE/HEAD/OPTIONS/PATCH,其他返回告警
请求体大小 超过上限(默认 10MB)触发告警
Content-Type 仅允许配置的 MIME 类型白名单
CSRF Origin 检测跨域请求 Origin 与 Host 是否匹配,支持额外白名单
IP 黑名单 窗口时间 N 次攻击后自动封禁(默认 5次/60s→封禁15分钟),支持 File/Redis/Memory 存储

数据与序列化攻击 (5)

检测器 检测模式
PHP 反序列化 O:数字: / C:数字: 序列化对象、unserialize()、魔术方法(__wakeup/__destruct
CSV 注入 `=cmd\ @SUM(+/-公式前缀、HYPERLINK/DDE`
邮件头注入 Bcc/Cc/From/To 注入、MIME multipart、boundary 参数
JWT 攻击 alg: none 绕过、kid 路径遍历、空签名检测(结构解码分析)
原型污染 __proto__/constructor 键、__defineGetter__/__defineSetter__

文件与敏感数据 (3)

检测器 检测模式
路径遍历 ../..\\php://filter/php://input、null 字节、URL 编码绕过、/etc/passwd
恶意上传 扩展名白名单(15种)+ PHP 标签 <?php/<?= 内容扫描
数据泄露 信用卡号、AWS Access Key、私钥 -----BEGIN、数据库连接串、API Token、JWT Secret、GitHub PAT

存储后端 (3)

后端 说明
Memory sync.Mutex + map,30s 自动清理过期条目
File JSON 文件持久化,Close 时 flush
Redis 独立子模块,Pipeline Incr + TTL,需 go-redis/v9

使用说明

安装

1
go get github.com/erikwang2013/security-go

快速开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
"github.com/erikwang2013/security-go"
"github.com/erikwang2013/security-go/all"
)

func main() {
e := security.NewEngine()
all.RegisterAll(e) // 一键注册 27 个零配置检测器

// 单个检测
r := e.Detect("xss", "<script>alert(1)</script>")
fmt.Printf("检测到: %v, 严重程度: %d\n", r.Detected, r.Severity)

// 全量检测
for _, r := range e.DetectAll("' OR '1'='1") {
fmt.Printf("[%s] %s\n", r.Name, r.Message)
}
}

HTTP 请求检测

1
2
3
4
5
6
7
8
9
10
func handler(w http.ResponseWriter, r *http.Request) {
e := security.NewEngine()
all.RegisterAll(e)

for _, result := range e.DetectRequest(r) {
if result.Detected {
log.Printf("攻击检测: [%s] %s", result.Name, result.Message)
}
}
}

HTTP 校验器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 方法校验
e.Register(&httpval.Method{})

// 请求体大小限制
e.Register(httpval.NewBodySize(5 * 1024 * 1024)) // 5MB

// Content-Type 白名单
e.Register(httpval.NewContentType([]string{
"application/json", "application/x-www-form-urlencoded",
}))

// CSRF Origin 检查
e.Register(&httpval.CSRFOrigin{
Host: "example.com", AllowList: []string{"api.example.com"},
})

// IP 黑名单(自动封禁:5次/60s → 封禁15分钟)
mem := storage.NewMemory()
defer mem.Close()
bl := httpval.NewIPBlacklist(mem)
e.Register(bl)

// 攻击发生时记录
blocked, _ := bl.RecordAttack(clientIP)

自定义检测器

1
2
3
4
5
6
7
8
9
10
11
12
type MyDetector struct{}

func (d *MyDetector) Name() string { return "my_detector" }

func (d *MyDetector) Detect(input string) *security.Result {
return &security.Result{
Name: "my_detector", Detected: strings.Contains(input, "evil"),
Severity: security.SeverityHigh, Message: "检测到恶意内容",
}
}

e.Register(&MyDetector{})

相关文档



Copyright (c) 2026 erik erik@erik.xyzhttps://erik.xyz