D4rk-Wolf/PenPad
GitHub: D4rk-Wolf/PenPad
一款企业级渗透测试报告生成器,帮助安全团队高效管理测试项目并生成结构化的客户交付报告。
Stars: 0 | Forks: 0
# PenPad
一款由 **D4rkWolf Studios** 开发的渗透测试报告生成器。PenPad 简化了渗透测试人员的报告流程——记录漏洞发现、使用 CVSS v3.1 进行评分、管理可复用模板,并生成可直接交付给客户的 PDF 报告。
## 核心功能
- **项目(Engagement)管理** — 通过客户名称、测试范围、测试窗口期和首席测试员来跟踪报告
- **动态漏洞记录** — CVSS 评分、自动严重性判定、描述、影响、建议以及证据
- **精选漏洞模板** — 涵盖 OWASP Web Top 10、OWASP API Top 10 和基础设施领域的 20 个模板
- **自定义模板 (Pro)** — 将任何漏洞发现保存为个人可复用模板
- **PDF 导出 (Pro)** — 包含封面、执行摘要和漏洞细节拆解的专业结构化报告
- **订阅控制** — 通过 Stripe Billing 自动解锁 Pro 功能
## 技术栈
| 层级 | 技术 |
|---|---|
| 框架 | Next.js 16 (App Router, React 19) |
| 样式 | Tailwind CSS v4 + 自定义设计令牌 |
| 数据库 | Supabase (PostgreSQL + Row Level Security) |
| ORM | Drizzle ORM |
| 支付 | Stripe (订阅 + webhooks) |
| PDF | @react-pdf/renderer |
| 监控 | Sentry (错误、tracing、已认证的 session replay) |
| 托管 | Vercel |
## 架构
```
Browser ──→ Next.js App Router (Vercel)
│
├── Server Components ──→ Supabase (via adminDb / service role)
├── Server Actions ──→ Validated with Zod, auth-guarded
├── API Routes ──→ /api/stripe/webhook, /api/pdf/[id]
└── proxy.ts ──→ Auth session refresh + route protection
Supabase ─── PostgreSQL (RLS enabled) + Auth (email/password + email confirmation)
Stripe ─── Checkout, Customer Portal, Webhook (idempotent via stripe_events_processed)
Sentry ─── Error tracking + Session Replay (authenticated users only, privacy-masked)
```
**请求流程:**
1. 匿名请求 → `proxy.ts` 检查 session;如果缺失则重定向至 `/login`
2. 已认证请求 → Server Component 通过 `adminDb()` 获取数据(service role,仅限服务器端)
3. 表单提交 → Server Action 通过 Zod 进行验证,检查身份认证,并通过 `adminDb()` 写入数据
4. 订阅检查 → `getMySubscription()` 结合 `React.cache()` — 每个请求内去重
5. PDF 导出 → `/api/pdf/[id]` 以 30 秒的渲染超时时间流式传输渲染好的 PDF
**订阅层级:**
- Free:最多 3 份报告,每份报告包含 10 个漏洞发现,无自定义模板,无 PDF 导出
- Pro (`status = 'active'`):无限报告和漏洞发现,支持自定义模板和 PDF 导出
- 状态通过以下事件从 Stripe 同步:`checkout.session.completed`、`customer.subscription.*`、`invoice.payment_failed`
## 项目结构
```
src/
├── app/
│ ├── (app)/ # Authenticated pages — dashboard, reports, settings, templates
│ ├── (auth)/ # Login, signup, email confirmation
│ ├── actions/ # Server Actions (findings, reports, templates, settings)
│ └── api/ # Route handlers (Stripe webhook, PDF export)
├── components/
│ ├── findings/ # FindingForm, FindingCard
│ ├── reports/ # ReportForm, ReportCard
│ ├── pdf/ # React-PDF document layout
│ ├── layout/ # AppShell, Sidebar, Header
│ └── penpad/ # Design system (ui.tsx, tokens, icons)
└── lib/
├── db/ # Drizzle schema + generated types
├── supabase/ # Client helpers (browser / server / admin)
├── stripe.ts # Stripe singleton (server-only)
├── subscriptions.ts # getMySubscription() — cached, IDOR-safe
└── validations.ts # Shared Zod schemas
supabase/migrations/ # SQL migrations — applied in timestamp order by CI
```
## 数据库 Schema
| 表格 | 用途 |
|---|---|
| `reports` | 项目元数据(客户、范围、时间线、状态、所有者) |
| `findings` | 每份报告的漏洞发现(CVSS、描述、影响、建议、证据) |
| `subscriptions` | 从 Stripe 同步的订阅状态 |
| `finding_templates` | 自定义可复用模板(仅限 Pro) |
| `stripe_events_processed` | Webhook 幂等性日志 |
所有表格均已启用 RLS。所有用户数据表在移除 `auth.users` 时会级联删除。
## 安全性
- 所有表格均启用 RLS — 用户只能访问自己的数据
- 所有 Server Actions 均使用 Zod 验证(长度限制、类型强制转换)
- `admin.ts` 和 `stripe.ts` 使用 `server-only` 守卫 — service-role 密钥永远不会到达浏览器
- 每个 Stripe 事件都进行 Webhook HMAC 验证 + 幂等性去重
- Stripe 重定向验证 — 在跟随之前会检查 URL 是否匹配 `*.stripe.com`
- `next.config.ts` 中配置了安全响应头(CSP、HSTS、X-Frame-Options、Permissions-Policy)
- Sentry Session Replay 仅对已认证用户激活;所有文本均已掩码,屏蔽所有媒体
- 漏洞披露:`/.well-known/security.txt`
## 许可证
由 D4rkWolf Studios 开发。保留所有权利。
标签:PPID欺骗, Stripe, Supabase, 报告生成器, 测试用例, 自动化攻击