Perufitlife/payload-security

GitHub: Perufitlife/payload-security

一款零依赖的 Payload CMS 无密钥主动探测安全审计工具,通过匿名请求实时确认未授权数据泄露漏洞。

Stars: 0 | Forks: 0

# payload-security [![npm](https://img.shields.io/npm/v/payload-security?color=red)](https://www.npmjs.com/package/payload-security) [![下载量](https://img.shields.io/npm/dw/payload-security)](https://www.npmjs.com/package/payload-security) ![许可证](https://img.shields.io/badge/license-MIT-green) ![node](https://img.shields.io/badge/node-%3E%3D18-blue) ![依赖](https://img.shields.io/badge/dependencies-0-brightgreen) ``` $ 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, 密码管理, 暗色界面, 未授权访问, 自定义脚本