kraciasty/stzr

GitHub: kraciasty/stzr

stzr 是一个基于 struct tag 的 Go 结构体 HTML 消毒库,旨在用声明式方式替代手动逐字段的输入净化。

Stars: 2 | Forks: 0

# stzr [![Go Reference](https://pkg.go.dev/badge/github.com/kraciasty/stzr.svg)](https://pkg.go.dev/github.com/kraciasty/stzr) [![Go Report Card](https://goreportcard.com/badge/github.com/kraciasty/stzr)](https://goreportcard.com/report/github.com/kraciasty/stzr) ![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/kraciasty/stzr) ![GitHub](https://img.shields.io/github/license/kraciasty/stzr) [![codecov](https://codecov.io/gh/kraciasty/stzr/graph/badge.svg?token=AFV16W16G9)](https://codecov.io/gh/kraciasty/stzr) 使用 struct tag 进行 HTML 消毒。由 [bluemonday](https://github.com/microcosm-cc/bluemonday) 提供支持。 ## 设计初衷 _受够了在复杂的嵌套结构中**手动对每个 string 字段进行消毒**,我创建了一种**基于 tag 的方法**来声明式地处理 HTML 消毒。_ ## 功能 合理的输入消毒体验: - **基于 tag** - 只需添加 tag - **递归** - 处理嵌套的 struct、slice、map、指针和泛型 - 内置**策略**:`strict` 和 `ugc`,由 [bluemonday 策略](https://pkg.go.dev/github.com/microcosm-cc/bluemonday#Policy)提供支持 - 支持通过策略或自定义函数进行**扩展** ## 快速开始 ``` go get -u github.com/kraciasty/stzr ``` ### 基本用法 ``` import "github.com/kraciasty/stzr" type Character struct { Name string `sanitize:"strict"` Bio string `sanitize:"ugc"` } character := &Character{ Name: `Rick Sanchez`, Bio: `Genius scientist from dimension C-137 `, } stzr.SanitizeStruct(character) // Name: "Rick Sanchez" // Bio: "Genius scientist from dimension C-137" ``` ### 字符串消毒 ``` clean, err := stzr.SanitizeString("ugc", `Wubba lubba dub dub!`) // Returns: "Wubba lubba dub dub!" ```
自定义策略 ``` minimal := bluemonday.NewPolicy().AllowElements("b", "i") links := bluemonday.NewPolicy(). AllowElements("a"). AllowAttrs("href"). OnElements("a") sanitizer := stzr.New( stzr.WithPolicy("minimal", minimal), stzr.WithPolicy("links", links), ) type Blog struct { Content string `sanitize:"minimal"` Footer string `sanitize:"links"` } ```
与 oapi-codegen 集成 将 `x-oapi-codegen-extra-tags` 添加到你的 OpenAPI spec 中: ``` # openapi.yml components: schemas: CreateCharacterRequest: type: object properties: name: type: string x-oapi-codegen-extra-tags: # <--- sanitize: "strict" # strict policy backstory: type: string x-oapi-codegen-extra-tags: # <--- sanitize: "ugc" # ugc policy ``` 生成: ``` type CreateCharacterRequest struct { Name string `json:"name" sanitize:"strict"` Backstory string `json:"backstory" sanitize:"ugc"` } ```
与 Protocol Buffers 集成 使用类似 [protoc-go-inject-tag](https://github.com/favadi/protoc-go-inject-tag) 的工具将消毒 tag 添加到生成的 protobuf struct 中: ``` // character.proto message CreateCharacterRequest { string name = 1; // @inject_tag: sanitize:"strict" string backstory = 2; // @inject_tag: sanitize:"ugc" } ``` 生成后,运行: ``` protoc-go-inject-tag -input="*.pb.go" ``` 结果为: ``` type CreateCharacterRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty" sanitize:"strict"` Backstory string `protobuf:"bytes,2,opt,name=backstory,proto3" json:"backstory,omitempty" sanitize:"ugc"` } ```
## 文档 有关 Go 代码的文档参考 - 请查看 [pkg.go.dev](https://pkg.go.dev/github.com/kraciasty/stzr)。 ## 贡献 欢迎贡献! 如果你发现任何问题或想要改进该项目,请提交 pull request。 ## 许可证 该项目基于 MIT 许可证授权。有关更多信息,请参阅 [LICENSE](LICENSE) 文件。
标签:EVTX分析, Go, Ruby工具, XSS防护, 开发库, 数据清洗, 日志审计, 结构体标签