我在過去三個月審計了用戶用 Lovable 建立 MVP 後帶來的應用程式。這個模式非常一致,幾乎有點無聊:暴露的 Supabase 服務金鑰在客戶端程式碼中、零個 RLS 政策、硬編碼的 OpenAI 和 Stripe 密鑰就在 JavaScript 裡,任何人用 DevTools 就能取得。每一次都是這樣。

這不是對 Lovable 的批評。這個平台對於原型製作來說確實令人印象深刻。但「能運行的演示」和「可上線的應用程式」之間有一個很大的差距,而 Lovable 沒有告訴你這個差距中大部分的內容是什麼。一個社群研究人員審計了 50 個 AI 建立的應用程式,發現其中幾乎所有應用程式都存在相同的五個安全漏洞。另一個開發者掃描了 200+ 個 vibe-coded 網站,發現平均安全分數為 100 分中的 52 分——最差的情況集中在 Lovable + Supabase 應用程式。

讓我們逐一檢視我們不斷發現的每個漏洞、為什麼 Lovable 自身的工具會遺漏它們,以及如何精確地修復每一個。

目錄

Lovable Security Vulnerabilities 2026: Exposed Keys, Missing RLS, and What Audits Catch

造成問題的架構

要了解為什麼 Lovable 應用程式受到的影響不成比例,你需要了解架構。Lovable 專門使用 Supabase 作為其後端。沒有 Firebase 選項、沒有自訂後端、沒有逃生口。當你在 Lovable 中建立東西時,它會生成一個直接使用客戶端庫與 Supabase REST API 通話的 React 前端。

Supabase 的設計使得 anon 金鑰可以安全地公開暴露——它本質上是一個專案識別碼。安全模型完全依賴於 PostgreSQL 層級的列級安全 (RLS) 政策。把它想像這樣:

元件 應該公開嗎? 保護你的是什麼
Supabase URL 不需要任何東西——它只是一個 URL
anon 金鑰 每個表的 RLS 政策
service_role 金鑰 絕對不行 必須只留在伺服器端
資料庫連接字串 絕不要暴露給客戶端

問題是 Lovable 的 AI 生成的程式碼通常以相同的方式對待所有這些。它將 anon 金鑰放在前端(沒問題),但隨後建立的表沒有啟用 RLS(災難性的)。有時它也會將 service_role 金鑰放在客戶端程式碼中(遊戲結束)。如 Reddit 上的一位開發者所說:「AI 做你要求的事。它只是從不思考你沒有要求的事。」

漏洞 1:客戶端程式碼中暴露的 Supabase 金鑰

每個 Lovable 應用程式初始化 Supabase 客戶端的方式大致如下:

// src/integrations/supabase/client.ts
import { createClient } from '@supabase/supabase-js'

const supabaseUrl = 'https://xyzcompany.supabase.co'
const supabaseAnonKey = 'eyJhbGciOiJIUzI1NiIs...'

export const supabase = createClient(supabaseUrl, supabaseAnonKey)

anon 金鑰在這裡沒問題——這是設計的。問題有兩種形式:

`service_role` 金鑰洩露

我們見過 Lovable 生成的程式碼中 service_role 金鑰最終出現在客戶端程式碼中,通常是因為某人向 AI 提示「即使 RLS 阻止它也要讓它運行」。AI 的解決方案?使用管理員金鑰。service_role 金鑰完全繞過所有 RLS 政策。如果它在你的前端程式碼中,任何人都可以提取它並完全讀寫存取你的整個資料庫。

`.env` 檔案被提交到 Git

經常將 Lovable 專案部署到 GitHub 時,.env 檔案被提交到儲存庫。即使儲存庫現在是私有的——即使只是一分鐘——那些金鑰已經被洩露。機器人不斷掃描 GitHub 尋找這種確切的模式。

如何檢查:

# 搜尋程式碼中的 service_role 金鑰
grep -r "service_role" --include="*.ts" --include="*.tsx" --include="*.js" --include="*.env" .

# 檢查 git 歷史中意外提交的密鑰
git log --all -p -- '*.env'

**如何修復:**立即從所有客戶端程式碼中移除 service_role 金鑰。在 Supabase 儀表板中輪換金鑰(設定 → API)。只在伺服器端程式碼中使用金鑰——Supabase Edge Functions、Next.js API 路由或單獨的後端。

漏洞 2:缺少或損壞的 RLS 政策

這是大問題。CVE-2025-48757 暴露了 170+ 個 Lovable 建立的應用程式中的 303 個易受攻擊的端點。根據 Escape.tech,83% 的暴露 Supabase 資料庫涉及 RLS 錯誤配置。

當 Lovable 建立表時,預設情況下會發生什麼:

-- Lovable 通常生成的內容
CREATE TABLE user_profiles (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID REFERENCES auth.users(id),
  full_name TEXT,
  email TEXT,
  created_at TIMESTAMPTZ DEFAULT now()
);

-- 注意缺少什麼?RLS 沒有被啟用。
-- 這個表對任何有 anon 金鑰的人都完全可讀可寫。

沒有 RLS,你的 Supabase 資料庫本質上是一個公開 API。任何知道你的專案 URL 和 anon 金鑰的人——兩者都在你的前端程式碼中——都可以這樣做:

// 攻擊者的瀏覽器控制台
const { data } = await supabase.from('user_profiles').select('*')
// 返回每個使用者的資料

await supabase.from('user_profiles').delete().neq('id', '')
// 刪除所有內容

RLS 失敗的三種情況

失敗模式 發生什麼 嚴重性
完全沒有啟用 RLS 完全公開讀寫存取 危急
啟用了 RLS 但沒有定義政策 沒有人可以存取任何東西(應用程式損壞) 高(強制開發者停用 RLS)
過於寬容的政策(例如 USING (true) 看起來安全,實際上不是

第三個特別陰險。當被提示「修復權限」時,我們見過 Lovable 生成這樣的政策:

CREATE POLICY "Allow all access" ON user_profiles
  FOR ALL
  USING (true)
  WITH CHECK (true);

這是 RLS 劇場。它被啟用了,它有一個政策,它什麼都不做。

一個適當的政策看起來像什麼:

-- 啟用 RLS
ALTER TABLE user_profiles ENABLE ROW LEVEL SECURITY;

-- 使用者只能讀取自己的檔案
CREATE POLICY "Users read own profile" ON user_profiles
  FOR SELECT
  USING (auth.uid() = user_id);

-- 使用者只能更新自己的檔案
CREATE POLICY "Users update own profile" ON user_profiles
  FOR UPDATE
  USING (auth.uid() = user_id)
  WITH CHECK (auth.uid() = user_id);

-- 只有經過驗證的使用者可以插入,並且只能為自己
CREATE POLICY "Users insert own profile" ON user_profiles
  FOR INSERT
  WITH CHECK (auth.uid() = user_id);

Lovable Security Vulnerabilities 2026: Exposed Keys, Missing RLS, and What Audits Catch - architecture

漏洞 3:硬編碼的第三方 API 密鑰

每次都會讓我退縮。我們經常發現 OpenAI API 金鑰(sk-...)、Stripe 密鑰(sk_live_...)、SendGrid 金鑰和其他認證資料直接硬編碼在 React 元件中。

// 實際上在一個 Lovable 生成的檔案中找到的
const openai = new OpenAI({
  apiKey: 'sk-proj-abc123...',  // 這在你的瀏覽器程式碼中
})

任何打開 DevTools、進入「來源」標籤並搜尋 sk-sk_live 的人都可以獲得你的金鑰。攻擊者會自動化這一點。有一些機器人專門爬取 JavaScript 程式碼,尋找這些模式。

財務影響是真實的。我們有一個客戶因為暴露的 OpenAI 金鑰而在一個週末導致 $4,200 的費用。Stripe 密鑰更糟——它們授予完整的存取權限來處理退款、查看客戶資料和修改訂閱。

**修復:**將所有第三方 API 呼叫移至伺服器端函式。Supabase Edge Functions 可以很好地工作:

// supabase/functions/openai-proxy/index.ts
import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'

serve(async (req) => {
  const { prompt } = await req.json()
  
  const response = await fetch('https://api.openai.com/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${Deno.env.get('OPENAI_API_KEY')}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      model: 'gpt-4o',
      messages: [{ role: 'user', content: prompt }],
    }),
  })
  
  return new Response(JSON.stringify(await response.json()))
})

漏洞 4:缺少安全標頭

200+ 個網站的掃描發現大多數 Lovable 部署的應用程式運行時沒有安全標頭。沒有內容安全政策。沒有嚴格傳輸安全。沒有 X-Frame-Options。沒有 X-Content-Type-Options。

與暴露的資料庫相比,這可能看起來微不足道,但缺少標頭會啟用:

  • 點擊劫持——你的應用程式可以在惡意網站的 iframe 中嵌入
  • XSS 放大——沒有 CSP,注入的指令碼沒有限制
  • MIME 類型嗅探攻擊——瀏覽器可能會將檔案解釋為可執行程式碼
  • 降級攻擊——沒有 HSTS,流量可能被攔截
標頭 用途 Lovable 預設
Content-Security-Policy 防止 XSS,控制資源載入 缺少
Strict-Transport-Security 強制 HTTPS 缺少
X-Frame-Options 防止點擊劫持 缺少
X-Content-Type-Options 防止 MIME 嗅探 缺少
Referrer-Policy 控制推薦人資訊 缺少
Permissions-Policy 控制瀏覽器功能 缺少

漏洞 5:沒有輸入驗證或清理

Lovable 生成的表單通常將使用者輸入直接發送給 Supabase,不進行任何驗證。沒有長度檢查、沒有類型驗證、沒有 HTML 或 SQL 相鄰內容的清理。

雖然 Supabase 的 PostgREST 層防止了傳統的 SQL 注入,但缺少輸入驗證仍然會啟用:

  • 透過文字欄位中未清理的 HTML 進行儲存 XSS
  • 透過非常大的負載進行拒絕服務
  • 業務邏輯濫用(例如負數量、$0.00 價格)
  • 來自意外類型的資料損毀

Lovable 的內建安全掃描實際檢查的內容

Lovable 確實有一個內建的「安全掃描」功能可以從儀表板存取。要歸功——它存在。但以下是它實際覆蓋的內容與它沒有的內容:

檢查 內建掃描 生產審計
基本語法錯誤
已知相依性 CVE 部分
原始程式碼中硬編碼的密鑰
所有表上啟用的 RLS
RLS 政策正確性
Service_role 金鑰暴露
安全標頭
輸入驗證覆蓋
驗證配置審查
儲存貯體政策
速率限制
Cookie 安全旗標

內建掃描最多只是表面層級。它不會捕捉實際被利用的漏洞。

生產審計捕捉的是平台沒有的內容

當我們對為在 Lovable 上建立的客戶進行生產安全審計時,以下是我們通常發現和修復的內容。這是真實的清單,來自實際的參與:

資料庫層

  • 禁用 RLS 的表(平均:60-70% 的表)
  • 使用 true 作為條件的 RLS 政策
  • 缺少 DELETE 操作的政策(開發者忘記了刪除)
  • 在交集/連接表上沒有政策
  • 設置為公開的儲存貯體,沒有上傳限制
  • RLS 政策條件中使用的列上缺少索引(效能 + 安全性)

驗證層

  • 弱 JWT 密鑰(Supabase 預設值沒問題,但有時人們會改變它們)
  • 缺少電子郵件確認要求
  • 驗證端點上沒有速率限制
  • 沒有適當的代幣過期的密碼重設流程
  • OAuth 重定向 URL 配置錯誤

客戶端程式碼層

  • 前端程式碼中的 service_role 金鑰
  • 在元件中硬編碼的第三方 API 金鑰
  • .env 檔案被提交到 git 歷史
  • 在控制台中暴露使用者資料的除錯記錄
  • 洩露資料庫架構資訊的錯誤訊息

基礎設施層

  • 完全沒有安全標頭
  • 沒有 SecureHttpOnlySameSite 旗標的 Cookie
  • 暴露的伺服器版本資訊
  • 沒有 CORS 配置(接受來自任何來源的請求)
  • 包含已知 CVE 的相依性未在數月內更新

一個典型的我們審計的 Lovable 應用程式在上線前需要 15-25 項修復。其中大多數耗時不到一小時,但你需要先知道它們的存在。

Moltbook 事件:真實世界案例研究

2026 年 1 月,Wiz 的安全研究人員發現 Moltbook——一個 AI 社交網路——其整個 Supabase 資料庫因錯誤配置的客戶端而暴露。anon 金鑰在前端 JavaScript 中(正常),但 RLS 沒有在關鍵表上配置(災難性的)。

結果?150 萬個 API 金鑰可以存取。不只是使用者資料——實際上屬於已連接其 OpenAI、Anthropic 和其他帳戶的使用者的 API 金鑰。完整的讀寫存取每個表。一個研究人員只需使用瀏覽器控制台中的 Supabase 客戶端就可以瀏覽整個資料庫。

披露時間線很緊湊——Moltbook 的維護者在被聯繫後幾小時內修復了關鍵表。但損害視窗是未知的。資料庫在有人檢查之前暴露多長時間?沒有人知道。

這是 Lovable + Supabase 模式大規模發揮的情況。該平台生成工作程式碼。它只是不生成安全程式碼。

在上線前修復 Lovable 應用程式的方法

以下是我們使用的清單。如果你熟悉 SQL 和 Supabase 儀表板,你可以自己完成大部分工作:

第一步:審計每個表的 RLS

-- 在 Supabase SQL 編輯器中執行以查找沒有 RLS 的表
SELECT schemaname, tablename, rowsecurity 
FROM pg_tables 
WHERE schemaname = 'public';

rowsecurityfalse 的任何表都需要立即注意。

第二步:搜尋你的程式碼中是否有密鑰

# 搜尋常見的密鑰模式
grep -rn 'sk-' --include='*.ts' --include='*.tsx' --include='*.js' .
grep -rn 'sk_live' --include='*.ts' --include='*.tsx' --include='*.js' .
grep -rn 'service_role' --include='*.ts' --include='*.tsx' --include='*.js' .
grep -rn 'SUPABASE_SERVICE' --include='*.ts' --include='*.tsx' --include='*.env' .

第三步:編寫適當的 RLS 政策

對於每個表,為 SELECT、INSERT、UPDATE 和 DELETE 編寫明確的政策。始終使用 auth.uid() 檢查:

-- 使用者擁有的表的範本
ALTER TABLE your_table ENABLE ROW LEVEL SECURITY;

CREATE POLICY "select_own" ON your_table FOR SELECT
  USING (auth.uid() = user_id);

CREATE POLICY "insert_own" ON your_table FOR INSERT
  WITH CHECK (auth.uid() = user_id);

CREATE POLICY "update_own" ON your_table FOR UPDATE
  USING (auth.uid() = user_id)
  WITH CHECK (auth.uid() = user_id);

CREATE POLICY "delete_own" ON your_table FOR DELETE
  USING (auth.uid() = user_id);

第四步:將 API 呼叫移至伺服器端

任何需要密鑰的第三方 API 呼叫都需要在 Supabase Edge Function 或單獨的後端中執行。這是不可談判的。

第五步:新增安全標頭

如果你要部署到 Netlify、Vercel 或 Cloudflare,請透過其配置新增標頭。對於 Netlify,建立一個 _headers 檔案。對於 Next.js 應用程式,在 next.config.js 中新增它們。

第六步:考慮框架遷移

對於超越 MVP 的任何東西,我們經常建議將 Lovable 生成的 React 程式碼遷移到適當的 Next.js 或 Astro 專案中。這為你提供伺服器端 API 路由、適當的環境變數處理、驗證檢查中介軟體和真實的建立管道。這在前期需要更多工作,但安全姿態是天壤之別。

自動掃描工具

已經出現了幾個工具,專門用於審計 AI 生成的應用程式:

工具 檢查的內容 成本
Ship Safe (npx ship-safe audit .) RLS、service_role 暴露、儲存貯體、相依性 CVE 免費、開放原始碼
Vibe App Scanner (vibeappscanner.com) AI 建立應用程式的完整安全掃描 免費入門掃描
Snyk 相依性漏洞、程式碼掃描 免費層可用
Supabase 儀表板 → 驗證 → 政策 視覺 RLS 政策編輯器 包含在 Supabase 中

Ship Safe 是我開始的那個。它在本地執行,沒有任何東西留下你的機器,它是專門為 AI 工具建立的 Supabase 錯誤配置而建立的:

npx ship-safe audit .

它會標記禁用的 RLS、客戶端程式碼中的 service_role 金鑰、開放儲存貯體、弱驗證配置、硬編碼密鑰和相依性 CVE。

常見問題

Supabase anon 金鑰在前端程式碼中暴露安全嗎? 是的——但只有在你在每個表上都有適當的 RLS 政策時。anon 金鑰設計為公開。它就像一個專案識別碼。安全來自 RLS 政策,控制該金鑰實際可以存取的內容。沒有 RLS,anon 金鑰給任何人完整的資料庫存取權。

Lovable 在建立表時預設啟用 RLS 嗎? 否。至 2026 年初,Lovable 建立 Supabase 表時沒有預設啟用 RLS。這是平台中最大的單一安全差距。在 Lovable 生成表後,你需要手動啟用 RLS 並為每個表編寫政策。CVE-2025-48757 是這個預設行為的直接結果。

我如何檢查我的 Lovable 應用程式是否有暴露的密鑰? 在瀏覽器中打開你部署的應用程式,打開 DevTools (F12),進入「來源」標籤,並搜尋所有檔案以查找 sk-sk_liveservice_role 以及你使用的服務的任何 API 金鑰首碼。同時在你的程式碼上本地執行 npx ship-safe audit . 進行自動偵測。

Lovable 的內建安全掃描可以捕捉 RLS 問題嗎? 內建安全掃描不檢查 RLS 錯誤配置、缺少政策或暴露的服務金鑰。它涵蓋基本的程式碼層級問題,但遺漏代表最高風險的資料庫和基礎設施漏洞。你需要外部工具進行真實的安全評估。

CVE-2025-48757 發生了什麼? CVE-2025-48757 是一個漏洞披露,識別了用 Lovable 建立的 170+ 個應用程式中的 303 個易受攻擊的 API 端點。根本原因是 Lovable 建立 Supabase 表而不啟用 RLS,讓整個資料庫對任何有公開可用 anon 金鑰的人都可以存取。它強調了問題的系統性質。

我應該為生產應用程式遠離 Lovable 嗎? 不一定。Lovable 非常適合快速原型製作和建立 MVP。但生成的程式碼在生產使用前需要顯著的安全強化。許多團隊使用 Lovable 建立初始版本,然後遷移到具有伺服器端渲染、適當密鑰管理和安全中介軟體的適當框架。這是一種合理的方法。

保護 Lovable 應用程式以便上線需要多長時間? 對於具有 10-20 個表的典型應用程式,預計 2-5 天的集中工作來審計所有 RLS 政策、將密鑰移至伺服器端、新增安全標頭、驗證輸入和測試一切。具有儲存貯體、即時訂閱和多個使用者角色的更複雜應用程式可能需要更長時間。這不是無法克服的,但這也不是一小時的工作。

Bolt 或 Cursor 等其他 AI 應用程式建構器比 Lovable 更安全嗎? 200+ 個網站的掃描發現安全漏洞集中在 Lovable + Supabase 應用程式中。Bolt、Replit 和基於 Cursor/Cline 的應用程式沒有顯示相同的 RLS 錯誤配置模式。這並不意味著它們完全安全——所有 AI 生成的程式碼都需要審查——但 Lovable 特定的 Supabase 整合建立了其他工具沒有的獨特資料庫暴露漏洞類別。