Vibe Coder

OWASP 與常見漏洞:AI 生成程式的資安檢查清單

OWASP Top 10 是業界公認最常見的 Web 安全漏洞清單,涵蓋權限控管、加密、注入攻擊、設計與設定錯誤等類別。AI 生成的程式常見的問題是 SQL Injection、用 MD5 存密碼、API 回傳整包物件洩漏敏感欄位,這些都要在上線前逐一檢查修正。
OWASP 與常見漏洞:AI 生成程式的資安檢查清單

OWASP 與常見漏洞:AI 生成程式的資安檢查清單

攻擊者不會特地挑你的小作品下手,他們用自動化工具掃全部 IP,不挑對象。你的天氣小工具和大公司的系統一樣在攻擊範圍內,差別只在有沒有先做好防禦。

AI 生的程式碼預設有漏洞:SQL Injection、明文密碼、過度暴露的 API 回傳,這些都是 AI 常犯的錯,而它不會主動提醒你。這篇用 OWASP Top 10 當地圖,帶你認出最常見的幾種漏洞。

你將學到什麼

OWASP Top 10 是什麼

業界公認的十大 Web 安全漏洞清單,上線前的檢查基準。

Injection 最危險

SQL Injection 怎麼發生、為什麼 ORM 是最好的防線。

認證機制常見錯誤

明文密碼、沒有 Rate Limit、JWT 不設過期。

AI 生成程式的資安盲點

四個 AI 最常寫出來、你要主動抓出來的問題。

OWASP Top 10 概覽

排名類別簡說
A01Broken Access Control使用者能做不應該做的事(看別人的資料)
A02Cryptographic Failures加密做得不好,資料被看光
A03InjectionSQL Injection、XSS,輸入被當成程式碼執行
A04Insecure Design設計本身就不安全
A05Security Misconfiguration設定錯誤(預設密碼、開放不必要的 port)
A07Identity and Authentication Failures認證機制有問題(弱密碼、沒有 Rate Limit)
A09Security Logging Failures沒有稽核 Log,出事了不知道發生什麼

Injection:最危險的漏洞

危險做法使用者輸入' OR 1=1 --直接字串拼接 SQL略過驗證 資料外洩安全做法使用者輸入同樣的字串參數化查詢 / ORM當作資料處理 安全阻擋
同一個惡意輸入,拼字串會全滅,參數化查詢只會安全擋下。

使用者輸入的資料被當成程式碼執行,最常見的是 SQL Injection。

# 危險:使用者輸入直接拼進 SQL
email = "' OR 1=1 --"  # 惡意輸入
query = f"SELECT * FROM users WHERE email='{email}'"
# 實際執行:SELECT * FROM users WHERE email='' OR 1=1 --'
# 結果:回傳所有使用者的資料!

# 安全:用 parameterized query
query = "SELECT * FROM users WHERE email = $1"
result = await db.fetchrow(query, email)  # 驅動程式處理跳脫
ORM 是最好的防 Injection 方式用 SQLAlchemy、Prisma、Supabase Client 等 ORM,它們自動做參數化處理,不讓使用者輸入直接碰到 SQL。Vibe Coder 盡量用 ORM,不要自己拼 SQL 字串。

另一個常見類型是 XSS(跨站腳本攻擊):把惡意 JS 注入到網頁讓其他使用者執行。React 預設會跳脫 JSX 裡的內容,但直接用 dangerouslySetInnerHTML 或 innerHTML 就有風險。

Broken Authentication:認證機制的常見錯誤

問題風險正確做法
密碼明文存 DBDB 外洩,所有密碼直接洩漏用 bcrypt 或 argon2 hash
沒有 Rate Limit允許暴力破解密碼登入失敗 5 次鎖定 15 分鐘
JWT 不設過期Token 被偷後永久有效設定合理的過期時間(1 小時)
弱 JWT SecretToken 被偽造至少 256 位元的隨機 Secret
密碼沒有複雜度要求容易被猜到最少 8 字元,要有數字或符號
from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

def hash_password(password: str) -> str:
    return pwd_context.hash(password)

def verify_password(plain: str, hashed: str) -> bool:
    return pwd_context.verify(plain, hashed)

Sensitive Data Exposure:敏感資料在不該出現的地方出現

常見問題後果解法
API 回傳整個 DB 物件(含密碼 hash)前端能看到不應該看的欄位只回傳必要欄位,用 Pydantic response_model
錯誤訊息包含 Stack Trace洩漏系統架構給攻擊者前端只看通用錯誤,詳細記到 Log
Log 裡有密碼或 API KeyLog 被取得就等於金鑰洩漏Log 前過濾敏感欄位
HTTP 傳輸(沒有 HTTPS)傳輸中被竊聽強制 HTTPS,現代平台都自動支援

AI 生成程式的常見資安盲點

AI 常生成的問題正確做法
hashlib.md5(pwd)MD5 太快,可以暴力破解改用 bcrypt.hash(pwd)
return user.__dict__包含密碼 hash 等敏感欄位用 Pydantic 定義回傳格式
f"...WHERE id={id}"SQL Injection 風險用 ORM 或 parameterized query
沒有 CORS 設定允許任何網域存取你的 API設定允許的 Origin 白名單
只在自己的測試環境驗證漏洞驗證 SQL Injection 是否修復時,只能在自己的測試環境用惡意輸入測試,絕對不要對任何正式系統或他人的系統做這件事。

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

OWASP Top 10 是什麼?
OWASP 是開放的 Web 應用程式安全專案,每幾年發布一次 Top 10 清單,列出最常見的十大 Web 安全漏洞,是業界的資安基準。
為什麼 SQL Injection 這麼危險?
因為使用者輸入的資料如果直接拼進 SQL 語句,攻擊者只要送出像 ' OR 1=1 -- 這樣的字串,就能讓查詢回傳資料庫裡所有使用者的資料。用 ORM 或 parameterized query 可以完全避免。
React 不是本來就會防 XSS 嗎?
React 預設會跳脫 JSX 裡的內容,能擋掉大部分 XSS,但如果直接使用 dangerouslySetInnerHTML 或 innerHTML,等於自己把防線拆掉,這時候就有風險。
AI 生成的程式最常見的資安盲點是什麼?
常見的有四個:用 hashlib.md5 存密碼、API 直接回傳 user.__dict__ 洩漏敏感欄位、把使用者輸入直接拼進 SQL 字串、以及完全沒設定 CORS 白名單。