DataDog/go-sqllexer
GitHub: DataDog/go-sqllexer
一个用 Go 编写的轻量级、无外部依赖的 SQL 词法分析器,专注于 SQL 查询的 token 化、混淆与规范化处理。
Stars: 35 | Forks: 10
# go-sqllexer
此仓库包含一个手写的 SQL Lexer,专注于对 SQL 查询进行 token 化处理,以实现混淆和规范化。该 lexer 使用 Go 编写,没有外部依赖。
**注意** 这不是一个 SQL parser,它只负责对 SQL 查询进行 token 化处理。
## 功能
- :rocket: 快速且轻量级的 token 化(不基于正则表达式)
- :lock: 混淆敏感数据(例如,数字、字符串、Postgres 中的美元引用字符串等特定字面量)
- :book: 甚至适用于被截断的查询
- :globe_with_meridians: 支持 UTF-8
- :wrench: 规范化混淆后的查询
## 安装
### 作为库
```
go get github.com/DataDog/go-sqllexer
```
### 作为命令行工具
```
# Clone 仓库
git clone https://github.com/DataDog/go-sqllexer.git
cd go-sqllexer
# Build 二进制文件
make build
# 或者直接安装到你的 PATH
make install
```
## 用法
### Token 化
```
import "github.com/DataDog/go-sqllexer"
func main() {
query := "SELECT * FROM users WHERE id = 1"
lexer := sqllexer.New(query)
for {
token := lexer.Scan()
if token.Type == EOF {
break
}
fmt.Println(token)
}
}
```
### 混淆
```
import (
"fmt"
"github.com/DataDog/go-sqllexer"
)
func main() {
query := "SELECT * FROM users WHERE id = 1"
obfuscator := sqllexer.NewObfuscator()
obfuscated := obfuscator.Obfuscate(query)
// "SELECT * FROM users WHERE id = ?"
fmt.Println(obfuscated)
}
```
### 规范化
```
import (
"fmt"
"github.com/DataDog/go-sqllexer"
)
func main() {
query := "SELECT * FROM users WHERE id in (?, ?)"
normalizer := sqllexer.NewNormalizer(
WithCollectComments(true),
WithCollectCommands(true),
WithCollectTables(true),
WithKeepSQLAlias(false),
)
normalized, statementMetadata, err := normalizer.Normalize(query)
// "SELECT * FROM users WHERE id in (?)"
fmt.Println(normalized)
}
```
## 命令行用法
`sqllexer` 二进制文件为所有库功能提供了命令行界面:
```
# 显示帮助
sqllexer -help
# 从 stdin Obfuscate SQL
echo "SELECT * FROM users WHERE id = 1" | sqllexer
# 从文件 Obfuscate SQL
sqllexer -input query.sql -output obfuscated.sql
# 为 PostgreSQL Normalize SQL
sqllexer -mode normalize -dbms postgresql -input query.sql
# Tokenize SQL
sqllexer -mode tokenize -input query.sql
# 使用自定义选项进行 Obfuscate
sqllexer -replace-digits=false -keep-json-path=true -input query.sql
```
### 可用模式
- **obfuscate**(默认):用占位符替换敏感数据
- **normalize**:规范化 SQL 查询以实现一致的格式
- **tokenize**:显示 SQL 查询中的所有 token
## 测试
```
go test -v ./...
```
## 基准测试
```
go test -bench=. -benchmem ./...
```
## 许可证
[MIT 许可证](LICENSE)
标签:EVTX分析, 文档结构分析, 日志审计