⚡

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

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

安全审计 0 次安装 21 次浏览 更新于 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保护