kraciasty/stzr
GitHub: kraciasty/stzr
stzr 是一个基于 struct tag 的 Go 结构体 HTML 消毒库,旨在用声明式方式替代手动逐字段的输入净化。
Stars: 2 | Forks: 0
# stzr
[](https://pkg.go.dev/github.com/kraciasty/stzr)
[](https://goreportcard.com/report/github.com/kraciasty/stzr)


[](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!"
```
## 文档
有关 Go 代码的文档参考 - 请查看 [pkg.go.dev](https://pkg.go.dev/github.com/kraciasty/stzr)。
## 贡献
欢迎贡献!
如果你发现任何问题或想要改进该项目,请提交 pull request。
## 许可证
该项目基于 MIT 许可证授权。有关更多信息,请参阅 [LICENSE](LICENSE) 文件。
自定义策略
``` 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"` } ```标签:EVTX分析, Go, Ruby工具, XSS防护, 开发库, 数据清洗, 日志审计, 结构体标签