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分析, 文档结构分析, 日志审计