名称: supabase-audit-auth-signup 描述: 测试用户注册是否开放,并识别注册过程中的潜在滥用向量。
注册流程审计
🔴 关键: 需要渐进式文件更新
您必须逐步写入上下文文件,而不是仅在结束时写入。
- 完成每个测试后立即写入
.sb-pentest-context.json- 每次测试前后记录到
.sb-pentest-audit.log- 请勿等到技能完成才更新文件
- 如果技能崩溃或被中断,所有先前发现必须已保存
这不是可选的。未能渐进式写入是关键错误。
此技能测试用户注册流程的安全问题和配置错误。
何时使用此技能
- 验证注册是否被适当限制
- 测试注册滥用向量
- 检查注册的速率限制
- 作为认证安全审计的一部分
先决条件
- Supabase URL和匿名密钥可用
- 建议已完成认证配置审计
注册安全的重要性
开放注册可能导致:
| 风险 | 描述 |
|---|---|
| 垃圾账户 | 机器人创建虚假账户 |
| 资源滥用 | 免费层级利用 |
| 电子邮件垃圾邮件 | 使用您的服务发送电子邮件 |
| 数据污染 | 数据库中的虚假数据 |
| 攻击面 | 更多账户意味着更多攻击向量 |
执行的测试
| 测试 | 目的 |
|---|---|
| 注册可用性 | 注册是否开放? |
| 电子邮件验证 | 是否接受无效电子邮件? |
| 速率限制 | 能否创建多个账户? |
| 一次性电子邮件 | 临时电子邮件是否被阻止? |
| 密码策略 | 接受哪些密码? |
| 响应信息 | 泄露了哪些信息? |
使用方式
基本注册测试
在我的Supabase项目上测试注册安全
检查特定方面
测试注册是否阻止一次性电子邮件
输出格式
═══════════════════════════════════════════════════════════
注册流程审计
═══════════════════════════════════════════════════════════
项目: abc123def.supabase.co
端点: /auth/v1/signup
─────────────────────────────────────────────────────────
注册可用性
─────────────────────────────────────────────────────────
状态: ✅ 开放(任何人都可以注册)
测试结果:
POST /auth/v1/signup
请求体: {"email": "test-xxxxx@example.com", "password": "TestPass123!"}
响应: 200 OK - 账户已创建
评估: 注册公开可用。
审查是否预期如此。
─────────────────────────────────────────────────────────
电子邮件验证
─────────────────────────────────────────────────────────
有效电子邮件格式:
├── user@domain.com: ✅ 接受(预期)
├── user+tag@domain.com: ✅ 接受(预期)
└── user@subdomain.domain.com: ✅ 接受(预期)
无效电子邮件格式:
├── user@: ❌ 拒绝(好)
├── @domain.com: ❌ 拒绝(好)
├── user@.com: ❌ 拒绝(好)
└── 非电子邮件: ❌ 拒绝(好)
一次性电子邮件测试:
├── user@mailinator.com: ✅ 接受 ← 🟠 P2
├── user@tempmail.com: ✅ 接受 ← 🟠 P2
└── user@guerrillamail.com: ✅ 接受 ← 🟠 P2
发现: 未阻止一次性电子邮件。
风险: 用户可以创建一次性账户。
建议: 考虑在应用程序逻辑中使用电子邮件验证
服务或黑名单。
─────────────────────────────────────────────────────────
密码策略
─────────────────────────────────────────────────────────
最小长度测试:
├── "12345" (5 个字符): ❌ 拒绝
├── "123456" (6 个字符): ✅ 接受 ← P2 短
└── "1234567890" (10 个字符): ✅ 接受
当前策略: 最小6个字符
弱密码测试:
├── "password": ✅ 接受 ← 🟠 P2
├── "123456": ✅ 接受 ← 🟠 P2
├── "qwerty123": ✅ 接受 ← 🟠 P2
└── "letmein": ✅ 接受 ← 🟠 P2
发现: 接受常见弱密码。
建议:
1. 增加最小长度至8个以上字符
2. 考虑密码强度要求
3. 检查常见密码列表
─────────────────────────────────────────────────────────
速率限制
─────────────────────────────────────────────────────────
注册速率测试(相同IP):
├── 请求1: ✅ 200 OK
├── 请求2: ✅ 200 OK
├── 请求3: ✅ 200 OK
├── 请求4: ❌ 429 请求过多
└── 重试后: 3600 秒
速率限制: 每个IP每小时3次注册
评估: ✅ 速率限制有效(好)
─────────────────────────────────────────────────────────
信息泄露
─────────────────────────────────────────────────────────
现有电子邮件测试:
POST /auth/v1/signup (使用现有电子邮件)
响应: "用户已注册"
发现: 🟠 P2 - 响应透露电子邮件存在
这允许:
├── 电子邮件枚举攻击
├── 知道某人是否有账户
└── 有针对性的网络钓鱼尝试
建议: 对新和现有账户使用通用消息,如
"检查您的电子邮件以继续"。
─────────────────────────────────────────────────────────
电子邮件确认
─────────────────────────────────────────────────────────
状态: ❌ 不需要(已在认证配置中确认)
测试: 创建账户并检查会话
结果: 用户立即认证,无需
电子邮件确认。
─────────────────────────────────────────────────────────
总结
─────────────────────────────────────────────────────────
注册: 对公众开放
速率限制: ✅ 有效(3次/小时)
电子邮件确认: ❌ 不需要
发现:
├── P1: 电子邮件确认禁用
├── P2: 接受一次性电子邮件
├── P2: 接受弱密码
└── P2: 可能电子邮件枚举
安全评分: 5/10
优先操作:
1. 启用电子邮件确认
2. 加强密码策略
3. 考虑阻止一次性电子邮件
4. 使用通用错误消息
═══════════════════════════════════════════════════════════
测试详情
一次性电子邮件检测
测试的常见一次性电子邮件域名:
- mailinator.com
- tempmail.com
- guerrillamail.com
- 10minutemail.com
- throwaway.email
弱密码列表
测试的常见密码:
- password, password123
- 123456, 12345678
- qwerty, qwerty123
- letmein, welcome
- admin, administrator
速率限制测试
尝试1: 200 OK
尝试2: 200 OK
尝试3: 200 OK
尝试4: 429 请求过多
上下文输出
{
"signup_audit": {
"timestamp": "2025-01-31T13:00:00Z",
"signup_open": true,
"rate_limit": {
"enabled": true,
"limit": 3,
"period": "hour"
},
"email_validation": {
"basic_validation": true,
"disposable_blocked": false
},
"password_policy": {
"min_length": 6,
"weak_passwords_blocked": false
},
"information_disclosure": {
"email_enumeration": true
},
"findings": [
{
"severity": "P1",
"issue": "电子邮件确认禁用"
},
{
"severity": "P2",
"issue": "接受一次性电子邮件"
},
{
"severity": "P2",
"issue": "接受弱密码"
},
{
"severity": "P2",
"issue": "可能电子邮件枚举"
}
]
}
}
修复示例
阻止一次性电子邮件
// 在您的注册处理程序或边缘函数中
import { isDisposable } from 'email-validator-package';
if (isDisposable(email)) {
throw new Error('请使用永久电子邮件地址');
}
加强密码要求
// 自定义密码验证
function validatePassword(password: string): boolean {
if (password.length < 8) return false;
if (!/[A-Z]/.test(password)) return false;
if (!/[a-z]/.test(password)) return false;
if (!/[0-9]/.test(password)) return false;
return true;
}
防止电子邮件枚举
// 始终返回相同消息
async function signup(email, password) {
try {
await supabase.auth.signUp({ email, password });
} catch (error) {
// 不要透露电子邮件是否存在
}
return { message: '检查您的电子邮件以继续' };
}
限制注册
如果注册应仅为邀请制:
// 使用管理员API邀请用户
const { data, error } = await supabaseAdmin.auth.admin.inviteUserByEmail(
'user@example.com'
);
// 或在仪表板中禁用注册并使用:
const { data, error } = await supabaseAdmin.auth.admin.createUser({
email: 'user@example.com',
email_confirm: true
});
强制: 渐进式上下文文件更新
⚠️ 此技能必须在执行期间逐步更新跟踪文件,而不是仅在结束时。
关键规则: 逐步写入
请勿在结束时批量所有写入。相反:
- 每次注册测试前 → 记录操作到
.sb-pentest-audit.log - 每次发现漏洞后 → 立即更新
.sb-pentest-context.json - 速率限制测试后 → 立即记录结果
这确保如果技能被中断、崩溃或超时,所有到该点的发现都被保留。
必需操作(渐进式)
-
更新
.sb-pentest-context.json与结果:{ "signup_audit": { "timestamp": "...", "signup_open": true, "rate_limit": { ... }, "findings": [ ... ] } } -
记录到
.sb-pentest-audit.log:[时间戳] [supabase-audit-auth-signup] [开始] 测试注册安全 [时间戳] [supabase-audit-auth-signup] [发现] P2: 接受弱密码 [时间戳] [supabase-audit-auth-signup] [上下文已更新] .sb-pentest-context.json 已更新 -
如果文件不存在,在写入前创建它们。
未能更新上下文文件是不可接受的。
强制: 证据收集
📁 证据目录: .sb-pentest-evidence/05-auth-audit/signup-tests/
要创建的证据文件
| 文件 | 内容 |
|---|---|
signup-tests/open-signup.json |
注册可用性测试 |
signup-tests/weak-password.json |
弱密码接受测试 |
signup-tests/disposable-email.json |
一次性电子邮件测试 |
signup-tests/rate-limit.json |
速率限制测试 |
证据格式
{
"evidence_id": "AUTH-SIGNUP-001",
"timestamp": "2025-01-31T10:55:00Z",
"category": "auth-audit",
"type": "signup_test",
"tests": [
{
"test_name": "weak_password_acceptance",
"severity": "P2",
"request": {
"method": "POST",
"url": "https://abc123def.supabase.co/auth/v1/signup",
"body": {"email": "test@example.com", "password": "123456"},
"curl_command": "curl -X POST '$URL/auth/v1/signup' -H 'apikey: $ANON_KEY' -H 'Content-Type: application/json' -d '{\"email\": \"test@example.com\", \"password\": \"123456\"}'"
},
"response": {
"status": 200,
"message": "用户已创建"
},
"result": "易受攻击",
"impact": "接受弱密码(6个字符)"
},
{
"test_name": "disposable_email",
"severity": "P2",
"request": {
"body": {"email": "test@mailinator.com", "password": "Test123456!"}
},
"response": {
"status": 200,
"message": "用户已创建"
},
"result": "易受攻击",
"impact": "未阻止一次性电子邮件"
}
]
}
相关技能
supabase-audit-auth-config— 完整认证配置supabase-audit-auth-users— 用户枚举测试supabase-audit-rls— 使用RLS保护用户数据