Perufitlife/payload-security
GitHub: Perufitlife/payload-security
一款零依赖的 Payload CMS 无密钥主动探测安全审计工具,通过匿名请求实时确认未授权数据泄露漏洞。
Stars: 0 | Forks: 0
# payload-security
[](https://www.npmjs.com/package/payload-security) [](https://www.npmjs.com/package/payload-security)   
```
$ npx payload-security --url https://cms.example.com
1 critical, 1 high, 1 medium — 3 CONFIRMED via anonymous probe
CRITICAL /api/posts readable without auth — 128 docs reachable
CRITICAL /api/users leaks apiKey, email to anonymous reads
MEDIUM /api/graphql GraphQL introspection enabled in production
```
## 为什么会有这个项目
Payload 是发展最快的原生 TypeScript headless CMS 之一(现已并入
Vercel)——但它**默认并不安全**。每个 collection 的
`access.read` 都必须显式设置;位于 `/api/{slug}` 的 REST API 和位于
`api/graphql` 的 GraphQL
会自动暴露。Payload 官方文档警告称,[local-API 操作会绕过访问控制](https://payloadcms.com/docs/local-api/access-control)
并且[自定义 endpoint 默认不进行身份验证](https://payloadcms.com/docs/access-control/overview)。
广为流传的 2026 年分析文章
[*Payload CMS 安全最佳实践:十大威胁与缓解策略*](https://u11d.com/blog/payload-cms-security-guide-2026-threats-prevention/)
(u11d) 一针见血地指出:*“攻击者首先扫描的是 API,而不是你的前端”*——而
很大一部分 Payload 项目在发布时,其 collection 并没有配置适当的读取
访问权限。
由于 endpoint 的结构是可预测的(`/api/{kebab-slug}`、`/api/graphql`),
因此匿名验证数据泄露变得轻而易举。`payload-security` 会执行这些检查,并
通过发送与攻击者完全相同的未验证请求来**确认真实的漏洞**——因此你可以根据事实而非猜测来进行排查。
## 检查内容
| 检查项 | 严重程度 | 确认方式 |
|---|---|---|
| 无需身份验证即可读取 Collection | 严重 | 匿名 `GET /api/{slug}` 返回 `docs` |
| 敏感字段泄露(`apiKey`/`email`/`hash`/`salt`) | 严重 | 返回的 doc 包含具有值的字段 |
| `/api/users` auth-collection 枚举 | 高 | 匿名 `GET /api/users` 返回用户 doc |
| 开放首个用户注册 | 高 | `/api/users` 可访问且报告 `totalDocs:0` |
| 生产环境开启 GraphQL introspection | 中 | `__schema` 查询在 `/api/graphql` 处得到响应 |
| 生产环境开启 GraphQL playground | 中 | 实时提供 `/api/graphql-playground` 服务 |
## 用法
```
# 探测在线实例(猜测常见的 collection slugs)
npx payload-security --url https://cms.example.com
# 从本地 repo 获取准确的 collection slugs,然后进行探测
npx payload-security --url https://cms.example.com --discover ./my-payload-app
# 探测特定 collections
npx payload-security --url https://cms.example.com --collections posts,media
# 生成可共享的 HTML 报告
npx payload-security --url https://cms.example.com --html report.html
# 仅静态(不发送任何请求)
npx payload-security --url https://cms.example.com --no-probe
```
输出为 stdout 上的 JSON(可通过管道传递给 CI)以及 stderr 上的一行摘要。
仅在出现用法错误时才会返回非零退出码——请根据 JSON 的 `summary` 来控制你的 pipeline。
## 安装(可选)
```
npm i -g payload-security
payload-security --url https://cms.example.com
```
零依赖。你的数据和凭证永远不会离开你的本机——每一次
请求都直接从该工具发送到你的 Payload 实例。
## 姊妹工具
对于后端技术栈的其余部分,我们采用相同的主动探测理念,且均基于 MIT 许可证:
[strapi-security](https://github.com/Perufitlife/strapi-security) ·
[directus-security](https://github.com/Perufitlife/directus-security) ·
[supabase-security](https://github.com/Perufitlife/supabase-security-skill) ·
[pocketbase-security](https://github.com/Perufitlife/pocketbase-security-skill) ·
[firebase-security](https://github.com/Perufitlife/firebase-security-skill) ·
[appwrite-security](https://github.com/Perufitlife/appwrite-security-skill) ·
[nhost-security](https://github.com/Perufitlife/nhost-security-skill) ·
[convex-security](https://github.com/Perufitlife/convex-security)
## 许可证
MIT © [Renzo Madueno](https://github.com/Perufitlife)
📚 属于 [**Awesome Backend Security Auditors**](https://github.com/Perufitlife/awesome-backend-security) 的一部分——这是无密钥主动探测审计工具的完整集合。
标签:API安全, GraphQL, JSON输出, MITM代理, Payload CMS, 密码管理, 暗色界面, 未授权访问, 自定义脚本