Supabase认证配置安全审计Skill supabase-audit-auth-config

本技能用于审计Supabase项目的认证配置,检测安全弱点如未启用邮件确认、弱密码策略、CORS配置等,并提供修复建议。关键词包括Supabase、认证安全、配置审计、网络安全、漏洞检测、安全评估。

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

名称: supabase-audit-auth-config 描述: 分析Supabase认证配置以发现安全弱点和错误配置。

认证配置审计

🔴 关键:需要渐进式文件更新

您必须边执行边写入上下文文件,而不是仅在最后。

  • 分析每个设置后立即写入.sb-pentest-context.json
  • 在每次测试前后记录到.sb-pentest-audit.log
  • 不要等到技能完成才更新文件
  • 如果技能崩溃或被中断,所有之前的发现必须已经保存

这不是可选的。未能渐进式写入是一个关键错误。

本技能分析Supabase项目的认证配置。

何时使用此技能

  • 审查认证安全设置
  • 在生产部署前
  • 审计与认证相关的漏洞时
  • 作为全面安全审查的一部分

先决条件

  • 可用的Supabase URL和匿名密钥
  • 检测已完成

认证端点

Supabase Auth (GoTrue) 暴露:

https://[项目].supabase.co/auth/v1/
端点 用途
/auth/v1/settings 公共设置(有限)
/auth/v1/signup 用户注册
/auth/v1/token 认证
/auth/v1/user 当前用户信息
/auth/v1/recover 密码恢复

可以检测的内容

从公共API,我们可以检测:

设置 检测方法
电子邮件认证启用 尝试注册
电话认证启用 检查设置
OAuth提供者 检查设置
注册禁用 尝试注册
电子邮件确认 注册响应
密码要求 错误消息

用法

基本认证审计

审计认证配置

检查特定功能

检查注册是否开放以及启用了哪些提供者

输出格式

═══════════════════════════════════════════════════════════
 认证配置审计
═══════════════════════════════════════════════════════════

 项目:abc123def.supabase.co
 认证端点:https://abc123def.supabase.co/auth/v1/

 ─────────────────────────────────────────────────────────
 认证方法
 ─────────────────────────────────────────────────────────

 电子邮件/密码:✅ 启用
 ├── 注册:✅ 开放(任何人都可以注册)
 ├── 电子邮件确认:❌ 不需要 ← P1 问题
 ├── 密码最小长度:6 字符 ← P2 考虑加长
 └── 安全密码检查:未知

 电话/SMS:✅ 启用
 └── 提供者:Twilio

 魔法链接:✅ 启用
 └── OTP过期时间:300 秒(5 分钟)

 OAuth提供者检测:3
 ├── Google:✅ 启用
 ├── GitHub:✅ 启用
 └── Discord:✅ 启用

 匿名认证:✅ 启用 ← 检查是否预期

 ─────────────────────────────────────────────────────────
 安全设置
 ─────────────────────────────────────────────────────────

 速率限制:
 ├── 注册:3/小时每IP(好)
 ├── 令牌:30/小时每IP(好)
 └── 恢复:3/小时每IP(好)

 会话配置:
 ├── JWT过期时间:3600 秒(1 小时)
 ├── 刷新令牌轮换:未知
 └── 不活动超时:未知

 安全头:
 ├── CORS:已配置
 ├── 允许来源:*(通配符) ← P2 考虑限制
 └── 凭证:允许

 ─────────────────────────────────────────────────────────
 发现
 ─────────────────────────────────────────────────────────

 🟠 P1:电子邮件确认禁用

 问题:用户无需验证电子邮件地址即可注册并立即访问应用。

 风险:
 ├── 使用无效电子邮件的虚假账户
 ├── 拼写错误(user@gmial.com)
 ├── 无验证的通信渠道
 └── 潜在的滥用

 建议:
 Supabase仪表板 → 认证 → 电子邮件模板
 → 启用“确认电子邮件”

 ─────────────────────────────────────────────────────────

 🟡 P2:最小密码长度短

 问题:最小密码长度为6字符。

 建议:增加到8-12字符最小。
 Supabase仪表板 → 认证 → 设置
 → 最小密码长度

 ─────────────────────────────────────────────────────────

 🟡 P2:通配符CORS来源

 问题:CORS允许来自任何来源的请求(*)。

 建议:限制到您的域名。
 Supabase仪表板 → 认证 → URL配置
 → 站点URL和重定向URL

 ─────────────────────────────────────────────────────────

 ℹ️ 信息:匿名认证启用

 注意:匿名认证已启用。

 如果意图(访客访问)这没问题。
 检查是否预期所有用户都需要认证。

 ─────────────────────────────────────────────────────────
 总结
 ─────────────────────────────────────────────────────────

 认证方法:5 启用
 OAuth提供者:3

 发现:
 ├── P1(高):1 - 电子邮件确认禁用
 ├── P2(中):2 - 密码长度,CORS
 └── 信息:1 - 匿名认证启用

 建议行动:
 1. 启用电子邮件确认
 2. 增加最小密码长度
 3. 限制CORS到特定域名
 4. 检查匿名认证是否必要

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

安全清单

电子邮件认证

设置 推荐 错误风险
电子邮件确认 ✅ 必须 虚假账户
密码长度 ≥8 字符 弱密码
密码复杂度 启用 易于猜测
速率限制 启用 暴力破解

OAuth配置

设置 推荐 错误风险
仅验证的提供者 账户接管
适当的重定向URL 特定URL OAuth重定向攻击
状态参数 启用 CSRF攻击

会话安全

设置 推荐 错误风险
短JWT过期时间 1小时或更短 令牌盗窃
刷新令牌轮换 启用 令牌重用
安全cookie标志 HttpOnly, Secure, SameSite XSS, CSRF

上下文输出

{
  "auth_config": {
    "timestamp": "2025-01-31T12:30:00Z",
    "methods": {
      "email": {
        "enabled": true,
        "signup_open": true,
        "email_confirmation": false,
        "min_password_length": 6
      },
      "phone": {
        "enabled": true,
        "provider": "twilio"
      },
      "magic_link": {
        "enabled": true,
        "otp_expiry": 300
      },
      "oauth": {
        "enabled": true,
        "providers": ["google", "github", "discord"]
      },
      "anonymous": {
        "enabled": true
      }
    },
    "findings": [
      {
        "severity": "P1",
        "issue": "Email confirmation disabled",
        "recommendation": "Enable email confirmation in dashboard"
      }
    ]
  }
}

常见认证漏洞

1. 无电子邮件确认

// 用户可以用任何电子邮件注册
const { data, error } = await supabase.auth.signUp({
  email: 'fake@example.com',  // 无需验证
  password: 'password123'
})
// 用户立即被认证

2. 弱密码策略

// 弱密码被接受
await supabase.auth.signUp({
  email: 'user@example.com',
  password: '123456'  // 最小长度6被接受
})

3. 不需要时的开放注册

如果您的应用应该只有管理员创建的用户:

-- 通过仪表板禁用公共注册
-- 或使用仅邀请流程

补救示例

启用电子邮件确认

  1. Supabase仪表板 → 认证 → 电子邮件模板
  2. 启用“确认电子邮件”
  3. 自定义确认电子邮件模板
  4. 在应用中处理未确认的用户

加强密码要求

  1. 仪表板 → 认证 → 设置
  2. 设置最小长度为8或以上
  3. 考虑启用密码强度检查

限制CORS

  1. 仪表板 → 认证 → URL配置
  2. 设置特定的站点URL
  3. 只添加您的域名到重定向URL
  4. 移除通配符条目

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

⚠️ 此技能必须在执行过程中渐进式更新跟踪文件,而不是仅在最后。

关键规则:边执行边写入

不要将所有写入批量放在最后。相反:

  1. 在检查每个认证方法之前 → 记录动作到.sb-pentest-audit.log
  2. 分析每个配置后 → 立即更新.sb-pentest-context.json
  3. 发现每个发现后 → 立即记录严重性

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

必需动作(渐进式)

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

    {
      "auth_config": {
        "timestamp": "...",
        "methods": { ... },
        "findings": [ ... ]
      }
    }
    
  2. 记录到.sb-pentest-audit.log

    [TIMESTAMP] [supabase-audit-auth-config] [START] Auditing auth configuration
    [TIMESTAMP] [supabase-audit-auth-config] [FINDING] P1: Email confirmation disabled
    [TIMESTAMP] [supabase-audit-auth-config] [CONTEXT_UPDATED] .sb-pentest-context.json updated
    
  3. 如果文件不存在,在写入前创建它们。

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

强制性:证据收集

📁 证据目录: .sb-pentest-evidence/05-auth-audit/

要创建的证据文件

文件 内容
auth-settings.json 完整的认证配置

证据格式

{
  "evidence_id": "AUTH-CFG-001",
  "timestamp": "2025-01-31T10:50:00Z",
  "category": "auth-audit",
  "type": "auth_configuration",

  "endpoint": "https://abc123def.supabase.co/auth/v1/",

  "configuration": {
    "email_auth": {
      "enabled": true,
      "signup_open": true,
      "email_confirmation_required": false,
      "min_password_length": 6
    },
    "phone_auth": {
      "enabled": true,
      "provider": "twilio"
    },
    "oauth_providers": ["google", "github", "discord"],
    "anonymous_auth": true
  },

  "security_settings": {
    "rate_limiting": {
      "signup": "3/hour",
      "token": "30/hour",
      "recovery": "3/hour"
    },
    "jwt_expiry": 3600,
    "cors_origins": "*"
  },

  "findings": [
    {
      "severity": "P1",
      "issue": "Email confirmation disabled",
      "impact": "Users can signup without verifying email",
      "recommendation": "Enable email confirmation"
    },
    {
      "severity": "P2",
      "issue": "Weak password policy",
      "impact": "Minimum 6 characters allows weak passwords",
      "recommendation": "Increase to 8+ characters"
    }
  ]
}

添加到curl-commands.sh

# === 认证配置测试 ===
# 测试注册可用性
curl -X POST "$SUPABASE_URL/auth/v1/signup" \
  -H "apikey: $ANON_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "test@example.com", "password": "test123456"}'

# 测试密码策略(弱密码)
curl -X POST "$SUPABASE_URL/auth/v1/signup" \
  -H "apikey: $ANON_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "weak@example.com", "password": "123456"}'

相关技能

  • supabase-audit-auth-signup — 测试注册流程
  • supabase-audit-auth-users — 测试用户枚举
  • supabase-audit-rls — 认证用户需要RLS保护