跳转到正文
报告库
用途分类 / 开发辅助

Golang Samber Slog Skill 安全审计

作者说它能做什么(原文)

Structured logging extensions for Golang using samber/slog-**** packages — multi-handler pipelines (slog-multi), log sampling (slog-sampling), attribute formatting (slog-formatter), HTTP middleware (slog-fiber, slog-gin, slog-chi, slog-echo), and backend routing (slog-datadog, slog-sentry, slog-loki, slog-syslog, slog-logstash, slog-graylog...). Apply when using or adopting slog, or when the codeb

第三方安全检查结论

先别安装或运行

已检查文件
6
发现的风险
4
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。未发现风险
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 2 项风险
高风险

启用请求正文记录可能把密码、令牌和个人数据发送到外部日志系统

原文依据:4 处
发现了什么

主示例明确启用 `WithRequestBody: true`,而参考配置仅说明正文有大小上限;列出的隐藏机制针对请求/响应头,并未证明任意正文敏感字段都会被清理。与此同时,该 Skill 推荐把日志路由到多个云端和通知后端。

为什么需要注意

如果 API 请求包含登录凭证、访问令牌、支付信息、健康数据或其他个人信息,这些内容可能进入 Loki、Sentry、Datadog、Slack 或 Webhook,并受其保留、访问和跨境传输规则约束。

示例主动开启请求正文记录;参考资料只说明正文默认限长,并明确的隐藏配置仅针对请求/响应头。若正文含密码、令牌或个人资料,且日志连接到 Loki、Datadog、Sentry 等后端,这些内容可能随日志离开进程。用户可要求作者默认关闭正文记录、说明正文级脱敏保证,并限制获准接收日志的后端。

SKILL.md:168来自说明文档打开原文件
```go// Gin with filters — skip health checksrouter.Use(sloggin.NewWithConfig(logger, sloggin.Config{    DefaultLevel:     slog.LevelInfo,    ClientErrorLevel: slog.LevelWarn,    ServerErrorLevel: slog.LevelError,    WithRequestBody:  true,    Filters: []sloggin.Filter{        sloggin.IgnorePath("/health", "/metrics"),    },}))```
查看另外 3 个位置
references/http-middlewares.md:28来自说明文档打开原文件
| `WithRequestID` | `bool` | `false` | Include request ID || `WithRequestBody` | `bool` | `false` | Include request body (capped) || `WithResponseBody` | `bool` | `false` | Include response body (capped) || `WithRequestHeader` | `bool` | `false` | Include request headers || `WithResponseHeader` | `bool` | `false` | Include response headers || `WithSpanID` | `bool` | `false` | Include OpenTelemetry span ID |
references/http-middlewares.md:37来自说明文档打开原文件
**Global configuration variables** (set before creating middleware):- `RequestBodyMaxSize` / `ResponseBodyMaxSize` — default 64KB each- `HiddenRequestHeaders` / `HiddenResponseHeaders` — headers to redact- `TraceIDKey` / `SpanIDKey` — context key names for OpenTelemetry
SKILL.md:187来自说明文档打开原文件
| Category     | Packages                                                   || ------------ | ---------------------------------------------------------- || Cloud        | `slog-datadog`, `slog-sentry`, `slog-loki`, `slog-graylog` || Messaging    | `slog-kafka`, `slog-fluentd`, `slog-logstash`, `slog-nats` || Notification | `slog-slack`, `slog-telegram`, `slog-webhook`              || Storage      | `slog-parquet`                                             || Bridges      | `slog-zap`, `slog-zerolog`, `slog-logrus`                  |
中风险

凭证示例鼓励把真实 Bot Token 和 Webhook URL 直接放进 Go 源码

原文依据:5 处
发现了什么

Slack、Telegram 和 Webhook 示例把凭证或带授权能力的 URL 写成字符串字段。当前值是占位符,不是泄露的真实秘密,但用户复制示例时可能直接用真实值替换。

为什么需要注意

真实凭证可能进入 Git 历史、代码审查、构建日志或发布产物。获得它们的人可能冒充机器人发消息、读取其权限范围内的数据,或向告警频道注入内容。

这些是代码示例且当前只含占位符,并非已泄露的真实凭证;但它们把 Webhook URL 和 Bot Token 直接表示为 Go 字符串字段,也没有在相邻文本中展示从环境变量或密钥管理器加载。用户若用真实值直接替换并提交源码,凭证可能进入版本历史或被其他读者获取。用户可要求作者提供安全加载示例,并限制日志、提交与构建产物中的秘密暴露。

references/backend-handlers.md:168来自说明文档打开原文件
// Via webhookhandler := slogslack.Option{    Level:      slog.LevelError,    WebhookURL: "https://hooks.slack.com/services/...",    Channel:    "alerts",}.NewSlackHandler()// Via bot tokenhandler := slogslack.Option{    Level:    slog.LevelError,    BotToken: "xoxb-...",    Channel:  "alerts",}.NewSlackHandler()```
查看另外 4 个位置
references/backend-handlers.md:188来自说明文档打开原文件
handler := slogtelegram.Option{    Level:    slog.LevelError,    Token:    "your-bot-token",    Username: "@your-channel",}.NewTelegramHandler()```
references/backend-handlers.md:200来自说明文档打开原文件
handler := slogwebhook.Option{    Level:    slog.LevelError,    Endpoint: "https://webhook.site/your-id",    Timeout:  10 * time.Second,}.NewWebhookHandler()```
references/backend-handlers.md:185来自说明文档打开原文件
```goimport slogtelegram "github.com/samber/slog-telegram/v2"handler := slogtelegram.Option{    Level:    slog.LevelError,    Token:    "your-bot-token",    Username: "@your-channel",}.NewTelegramHandler()```
references/backend-handlers.md:197来自说明文档打开原文件
```goimport slogwebhook "github.com/samber/slog-webhook/v2"handler := slogwebhook.Option{    Level:    slog.LevelError,    Endpoint: "https://webhook.site/your-id",    Timeout:  10 * time.Second,}.NewWebhookHandler()```
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 2 项风险
中风险

用 Pool 替换 Fanout 会让每条日志只到达一个后端,可能削弱审计与告警覆盖

原文依据:4 处
发现了什么

该 Skill 一方面准确说明 `Pool` 把每条记录发送给一个处理器,另一方面又在常见错误中建议用它处理多个同步处理器。若用户把需要广播的审计、告警或取证日志从 `Fanout` 改为 `Pool`,各后端只能看到随机分配的日志子集。

为什么需要注意

Sentry 可能收不到部分错误,归档系统可能缺少审计事件,多个后端之间也无法再交叉核对完整记录。这会降低事件检测和调查能力。

源码正确说明 Pool 会把每条记录仅发送给一个处理器,但又把它作为多同步处理器延迟问题的简短“修复”。若用户在必须让每个审计或告警后端收到完整记录的场景照此替换 Fanout,各后端只会得到部分记录,造成监控或取证缺口。用户应要求作者明确区分“负载均衡”与“并发广播”,并仅在后端等价且允许分片时使用 Pool。

SKILL.md:97来自说明文档打开原文件
| --- | --- | --- || `Fanout(handlers...)` | Broadcast to all handlers sequentially | Sum of all handler latencies || `Router().Add(h, predicate).Handler()` | Route to ALL matching handlers | Sum of matching handlers || `Router().Add(...).FirstMatch().Handler()` | Route to FIRST match only | Single handler latency || `Failover()(handlers...)` | Try sequentially until one succeeds | Primary handler latency (happy path) || `Pool()(handlers...)` | Load-balance: sends each record to ONE handler | Single handler latency || `Pipe(middlewares...).Handler(sink)` | Middleware chain before sink | Middleware overhead + sink |
查看另外 3 个位置
SKILL.md:201来自说明文档打开原文件
| Mistake | Why it fails | Fix || --- | --- | --- || Sampling after formatting | Wastes CPU formatting records that get dropped | Place sampling as outermost handler || Fanout to many synchronous handlers | Blocks caller — latency is sum of all handlers | Use `Pool()` for concurrent dispatch || Missing shutdown flush on batch handlers | Buffered logs lost on shutdown | `defer handler.Stop(ctx)` (Datadog), `defer lokiClient.Stop()` (Loki), `defer writer.Close()` (Kafka) || Router without default/catch-all handler | Unmatched records silently dropped | Add a handler with no predicate as catch-all |
references/pipeline-patterns.md:123来自说明文档打开原文件
## Pool — Load-Balanced DispatchRandomly distributes each record to one handler from the pool. Useful when you have equivalent handlers and want to spread load.```gologger := slog.New(    slogmulti.Pool()(        lokiHandler1, // shard 1        lokiHandler2, // shard 2        lokiHandler3, // shard 3    ),)```**When to use:** Multiple equivalent sinks where you want throughput distribution. Latency = single handler latency (not sum like Fanout).
SKILL.md:95来自说明文档打开原文件
| Pattern | Behavior | Latency impact || --- | --- | --- || `Fanout(handlers...)` | Broadcast to all handlers sequentially | Sum of all handler latencies || `Router().Add(h, predicate).Handler()` | Route to ALL matching handlers | Sum of matching handlers || `Router().Add(...).FirstMatch().Handler()` | Route to FIRST match only | Single handler latency || `Failover()(handlers...)` | Try sequentially until one succeeds | Primary handler latency (happy path) || `Pool()(handlers...)` | Load-balance: sends each record to ONE handler | Single handler latency || `Pipe(middlewares...).Handler(sink)` | Middleware chain before sink | Middleware overhead + sink |
中风险

声明的权限远超阅读日志文档所需,包括写文件、任意 Git 操作、联网和启动代理

原文依据:3 处
发现了什么

元数据一次性请求 Read、Edit、Write、Git 通配命令、WebFetch 和 Agent 等能力。Skill 的主体是日志架构指导,这些权限并非都需要;尤其 `Bash(git:*)` 没有限定为只读 Git 操作。

为什么需要注意

如果宿主把该字段当作实际授权,Skill 被调用期间的错误或被污染的后续指令可能修改项目文件、改写或发布 Git 状态、访问外部内容,或把工作交给额外代理,从而扩大受影响范围。现有证据没有显示这些能力已经被使用。

`allowed-tools` 是该 Skill 的活动权限声明,包含文件编辑/写入、所有 `git:*` 子命令、联网抓取及启动代理。主体目的包括指导和采用 Go 日志库,因此读取、Go 工具及有限编辑可能合理,文档也提到查询外部资料;但没有证据表明任意 Git 操作或 Agent 对每次使用都必要。若宿主按此声明授权,受提示影响的 Skill 可能修改文件、执行破坏性 Git 操作或向网络发送内容。用户可要求最小权限、只读 Git 和按需联网/代理批准。

SKILL.md:50来自说明文档打开原文件
      slog-mock: "0.1.0"allowed-tools: Read Edit Write Glob Grep Bash(go:*) Bash(golangci-lint:*) Bash(git:*) Agent WebFetch mcp__context7__resolve-library-id mcp__context7__query-docs AskUserQuestion Bash(godig:*) Bash(gopls:*) LSP mcp__gopls__*paths:
查看另外 2 个位置
SKILL.md:2来自说明文档打开原文件
---name: golang-samber-slogdescription: "Structured logging extensions for Golang using samber/slog-**** packages — multi-handler pipelines (slog-multi), log sampling (slog-sampling), attribute formatting (slog-formatter), HTTP middleware (slog-fiber, slog-gin, slog-chi, slog-echo), and backend routing (slog-datadog, slog-sentry, slog-loki, slog-syslog, slog-logstash, slog-graylog...). Apply when using or adopting slog, or when the codebase already imports any github.com/samber/slog-* package."user-invocable: true
SKILL.md:67来自说明文档打开原文件
This skill is not exhaustive — refer to library documentation and code examples for more information:- For Go package docs, symbols, versions, importers, and known vulnerabilities, → See `samber/cc-skills-golang@golang-pkg-go-dev` skill (`godig`), preferred over Context7 for Go package facts.- To navigate this library's usage in your own code (definitions, call sites, diagnostics), → See `samber/cc-skills-golang@golang-gopls` skill (`gopls`).- Context7 remains a fallback for docs not indexed on pkg.go.dev.
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

8 个说明模块

该 Skill 是一套 Go 结构化日志设计指南;提供管道、采样、格式化、HTTP 中间件及后端处理器的示例。所给材料没有安装脚本,元数据中的安装列表为空。

查看原文
SKILL.md:16来自说明文档打开原文件
        - go    install: []    skill-library-version:
SKILL.md:57来自说明文档打开原文件
# samber/slog-\*\*\*\* — Structured Logging Pipeline for Go20+ composable `slog.Handler` packages for Go 1.21+. Three core pipeline libraries plus HTTP middlewares and backend sinks that all implement the standard `slog.Handler` interface.

该 Skill 明确设计日志流向 Sentry、Loki、Datadog、Slack、Webhook 等外部系统,因此采用这些示例后,日志会离开应用进程并可能离开用户控制的基础设施。

查看原文
SKILL.md:187来自说明文档打开原文件
| Category     | Packages                                                   || ------------ | ---------------------------------------------------------- || Cloud        | `slog-datadog`, `slog-sentry`, `slog-loki`, `slog-graylog` || Messaging    | `slog-kafka`, `slog-fluentd`, `slog-logstash`, `slog-nats` || Notification | `slog-slack`, `slog-telegram`, `slog-webhook`              || Storage      | `slog-parquet`                                             || Bridges      | `slog-zap`, `slog-zerolog`, `slog-logrus`                  |

该 Skill 包含两项有益的数据保护与可靠性措施:在路由至各后端前格式化或遮蔽 PII,并在关闭时刷新会缓冲日志的处理器。它们只有在生成的代码实际采用并正确配置时才有效。

查看原文
SKILL.md:146来自说明文档打开原文件
Apply as a `Pipe` middleware so all downstream handlers receive clean attributes.```gologger := slog.New(    slogmulti.Pipe(slogformatter.NewFormatterMiddleware(        slogformatter.PIIFormatter("user"),          // mask PII fields        slogformatter.ErrorFormatter("error"),       // structured error info        slogformatter.IPAddressFormatter("client"),  // mask IP addresses    )).Handler(slog.NewJSONHandler(os.Stdout, nil)),)
SKILL.md:195来自说明文档打开原文件
**Batch handlers require graceful shutdown** — `slog-datadog`, `slog-loki`, `slog-kafka`, and `slog-parquet` buffer records internally. Flush on shutdown (e.g., `handler.Stop(ctx)` for Datadog, `lokiClient.Stop()` for Loki, `writer.Close()` for Kafka) or buffered logs are lost.
从这里开始 · 工作说明SKILL.md
golang-samber-slog
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。 另有 3 个章节,可在原文件中查看。

文件引用关系图

4 处引用
哪些文件发起引用引用了什么
连线表示真实的文件引用,不是运行顺序。点击节点可高亮相关连线,并查看具体文件和原文位置。虚线表示还有文件需要定位。
文件与检查记录6 个文件

检查范围与遗漏

逐文件查看涉及的内容

下方列出本次涉及的原文范围;纳入检查不代表已查清所有问题。

  • SKILL.md已纳入全文
  • references/backend-handlers.md已纳入全文
  • references/http-middlewares.md已纳入全文
  • references/pipeline-patterns.md已纳入全文
  • references/sampling-strategies.md已纳入全文
  • evals/evals.json已纳入全文

这份报告只针对上方版本。我们看了拿到的代码和说明文件,没有实际运行 Skill,也没有检查它另外安装的软件包。因此,这不是“保证安全”的承诺;换了版本或使用环境,结果也可能不同。

  • SKILL.md工作说明
  • evals/evals.json配套文件
  • references/backend-handlers.md配套文件
  • references/http-middlewares.md配套文件
  • references/pipeline-patterns.md配套文件
  • references/sampling-strategies.md配套文件

代码和说明中提到的操作

连接外部网站
SKILL.md:12来自说明文档打开原文件
    emoji: "🪵"    homepage: https://github.com/samber/cc-skills-golang    requires:
SKILL.md:63来自说明文档打开原文件
- [github.com/samber/slog-multi](https://github.com/samber/slog-multi) — handler composition- [github.com/samber/slog-sampling](https://github.com/samber/slog-sampling) — throughput control
SKILL.md:64来自说明文档打开原文件
- [github.com/samber/slog-multi](https://github.com/samber/slog-multi) — handler composition- [github.com/samber/slog-sampling](https://github.com/samber/slog-sampling) — throughput control- [github.com/samber/slog-formatter](https://github.com/samber/slog-formatter) — attribute transformation
运行命令
SKILL.md:50来自说明文档打开原文件
      slog-mock: "0.1.0"allowed-tools: Read Edit Write Glob Grep Bash(go:*) Bash(golangci-lint:*) Bash(git:*) Agent WebFetch mcp__context7__resolve-library-id mcp__context7__query-docs AskUserQuestion Bash(godig:*) Bash(gopls:*) LSP mcp__gopls__*paths:
读取了多少行
1,341
文件校验值(用于核对版本)
87cddace5b6f706d3f01dc1b8027fb335dbd2602b866a233b94c65f181e16a3d