2026年9月,TechCrunch记者Zack Whittaker披露了一批Supabase用户的数据库配置问题:大量应用将包含真实姓名、邮箱、手机号乃至内部业务记录的数据库表完全公开暴露在互联网上,任何人不需要任何凭证就能通过REST API直接读取。这不是黑客攻击,也没有任何零日漏洞。原因只有一个:Row Level Security(RLS)从未被启用。
这批应用有一个共同特征——它们大多由 AI 生成代码驱动,用 Claude Code、Codex 或 Gemini CLI 在数小时内搭建完成,走的是"Vibe Coding"路线:描述需求,让模型出代码,跑通了就上线。安全配置这一步,从未进入过开发流程。
"Vibe Coding"这个词最早由 Andrej Karpathy 在2025年初提出,本意是描述一种更直觉化、更流畅的人机协作编程体验。一年多过去,它已经演变成一种真实的产品开发模式:用 Claude Opus 4.8 或 GPT-5.4 描述功能,Codex 或 Claude Code 直接生成完整项目结构,开发者扮演的角色更接近"产品经理+部署员"。
这个流程本身没有问题。问题在于 AI 模型在生成代码时的优先级排序——它们极其擅长让功能"能跑",但不会主动问你"你的数据库权限策略是什么"。
Supabase 的默认行为加剧了这个风险。新建项目时,Supabase 会生成一个 anon key,这个密钥本质上是面向公网客户端的。只要表没有启用 RLS,anon key 就能无限制地读写整张表。AI 生成的前端代码会自然地把这个 key 嵌进 .env 文件,然后在客户端直接调用 Supabase SDK——这是最快的路径,也是最危险的路径。
一条能在浏览器控制台复现泄露的请求大概长这样:
curl 'https://<project-ref>.supabase.co/rest/v1/users?select=*' \
-H "apikey: <anon-key>" \
-H "Authorization: Bearer <anon-key>"
如果 users 表没有 RLS,这条命令会返回完整的用户表。
用 Claude Code 或 Codex 生成一个 Supabase 应用,模型会产出完整的 schema、migration 文件、API 调用逻辑。但它生成的 SQL 往往长这样:
create table profiles (
id uuid references auth.users on delete cascade,
username text,
email text,
created_at timestamp default now()
);
没有 alter table profiles enable row level security;,没有任何 policy 定义。这不是模型的 bug,而是训练数据的反映——Stack Overflow、GitHub 上大量的 Supabase 示例代码本身就没有 RLS,模型学到的"正确用法"就是这样。
GPT-5.4 和 Claude Opus 4.8 在你明确要求安全审计时,都能给出完整的 RLS policy 模板。问题是没人问。Vibe Coding 的工作流里,开发者描述的是业务功能,安全策略作为"隐性需求"根本不会出现在 prompt 里。
现实的对比很刺眼:
| 维度 | 传统开发流程 | Vibe Coding 流程 | |------|------------|-----------------| | 安全配置触发节点 | code review 强制检查 | 无,依赖开发者主动意识 | | RLS 配置频率 | 视团队规范,有 checklist | 几乎不配置 | | 密钥暴露风险 | CI/CD 扫描拦截 | 直接推送到前端 | | 上线前安全测试 | 有(哪怕简单的) | 通常没有 |
Supabase 官方数据显示,截至2026年初平台托管项目已超过 100 万个。TechCrunch 的调查虽然没有给出受影响项目的准确比例,但研究人员通过公开的 Supabase 项目 URL 规律,在数小时内就找到了多个完全开放读取的数据表,涉及用户量从数百到数万不等。
风险不只是被动数据泄露。公开的 anon key 加上未受保护的表,还意味着:
OpenAI 旗下 agent 产品此前被研究人员发现存在未经授权爬取公开数据库的行为——当你的 Supabase 表连认证都不需要,它实际上和一个公开 API 没有任何区别。
这不是理论建议,是最低安全基线。
1. 对每张表都显式启用 RLS,哪怕 policy 很简单
-- 启用 RLS
alter table profiles enable row level security;
-- 只允许用户读写自己的数据
create policy "users can read own profile"
on profiles for select
using (auth.uid() = id);
create policy "users can update own profile"
on profiles for update
using (auth.uid() = id);
如果你用 Claude Code 或 Codex 生成了 schema,把所有 create table 语句丢给模型,明确要求:"为每张表生成完整的 RLS policy,假设用户只能操作自己的数据"。这一次 prompt 能帮你补全大量遗漏。
2. 永远不要在前端直接使用 service role key
anon key 设计上就是给前端用的,但它必须配合 RLS 才安全。service_role key 有完整的数据库绕过权限,只能放在服务端环境变量里,永远不要出现在任何客户端代码中。用 grep -r "service_role" ./src 扫一遍你的代码仓库。
3. 在 Supabase Dashboard 开启 "Enable RLS by default"
项目设置 → API → 勾选要求新表默认启用 RLS。这一个开关能拦住大部分"忘了配置"的情况。同时在 Dashboard 的 Table Editor 里,会看到未启用 RLS 的表旁边有橙色警告图标——这是 Supabase 在2025年底加入的,主动去检查一遍。
把这次泄露事件归咎于 AI 生成代码本身,是打错了靶。Claude Code 生成的代码质量不比人写的差,但它无法替代开发者对业务安全边界的判断——因为这个判断本来就应该在 prompt 里给出,而不是期待模型自动猜测。
Vibe Coding 作为一种开发模式会继续普及,真正需要改变的是配套的安全意识和 checklist 文化。每次用 AI 生成数据库相关代码之后,问自己一个问题:这张表上的数据,如果被陌生人直接读取,你接受吗?
如果答案是不接受,那 RLS 就是第一行应该配置的代码,不是最后一行。
---
用 Claude Code 或 Codex 做安全审计这件事我最近试了不少,效果取决于你能不能持续调用足够好的模型。我自己在 XycAi 词元平台 接入模型——Claude Opus 4.8 和 GPT-5.4 价格低至官方价 1.4 折起,平台持有大模型算法备案号,可以开全球发票,支持 Claude Code、Codex、Gemini CLI 一键接入。日常做代码安全 review 的成本比直接订阅便宜很多,对独立开发者来说算力成本这块基本不用纠结了。