Supabase认证注册安全审计Skill supabase-audit-auth-signup

此技能用于审计Supabase用户注册流程的安全性,包括检查注册是否开放、电子邮件验证、速率限制等,以识别潜在漏洞和滥用向量。关键词包括:Supabase、注册安全、渗透测试、安全审计、网络安全、电子邮件验证、密码策略、速率限制、漏洞挖掘。

安全审计 0 次安装 0 次浏览 更新于 3/18/2026

名称: 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. 使用通用错误消息

═══════════════════════════════════════════════════════════

测试详情

一次性电子邮件检测

测试的常见一次性电子邮件域名:

弱密码列表

测试的常见密码:

  • 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
});

强制: 渐进式上下文文件更新

⚠️ 此技能必须在执行期间逐步更新跟踪文件,而不是仅在结束时。

关键规则: 逐步写入

请勿在结束时批量所有写入。相反:

  1. 每次注册测试前 → 记录操作到.sb-pentest-audit.log
  2. 每次发现漏洞后 → 立即更新.sb-pentest-context.json
  3. 速率限制测试后 → 立即记录结果

这确保如果技能被中断、崩溃或超时,所有到该点的发现都被保留。

必需操作(渐进式)

  1. 更新.sb-pentest-context.json 与结果:

    {
      "signup_audit": {
        "timestamp": "...",
        "signup_open": true,
        "rate_limit": { ... },
        "findings": [ ... ]
      }
    }
    
  2. 记录到.sb-pentest-audit.log:

    [时间戳] [supabase-audit-auth-signup] [开始] 测试注册安全
    [时间戳] [supabase-audit-auth-signup] [发现] P2: 接受弱密码
    [时间戳] [supabase-audit-auth-signup] [上下文已更新] .sb-pentest-context.json 已更新
    
  3. 如果文件不存在,在写入前创建它们。

未能更新上下文文件是不可接受的。

强制: 证据收集

📁 证据目录: .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保护用户数据