安全網頁應用程式編碼
將 OWASP Top 10:2025、ASVS 5.0、Cheat Sheet Series 以及精選 WSTG 內容轉化為實戰導向的網頁應用程式安全指引。
預設(內嵌模式): 安靜地編寫安全程式碼;只需標記您附近所見影響最高的問題。
稽核模式: 當使用者輸入「review」、「audit」、「harden」、「is this secure?」,或進行事件跟進時,讀取 assets/audit-checklist.md 並產出優先排序的發現結果。
模式,透過 $secure-webapp <模式> 呼叫:
$secure-webapp audit:全功能優先排序審查;讀取assets/audit-checklist.md。$secure-webapp quick-check:僅針對最高風險項目進行掃描 — 授權、驗證/工作階段、密碼、注入/XSS、上傳、SSRF、令牌。不產出完整檢查表報告。$secure-webapp harden:直接在允許編輯的地方套用安全變更;進行不破壞架構的小型修補;驗證,並標記任何需要產品核准的項目。$secure-webapp remediate:反覆進行稽核→修復循環;先完整讀取assets/remediate-checklist.md。$secure-webapp design-review:實作前的威脅模型分析 — 假設、信任邊界、濫用案例、必備控制項、未解決問題。$secure-webapp report:將正式報告寫入docs/security-audit-report-YYYY-MM-DD.md;先完整讀取assets/report-template.md並遵循每個步驟。需要在本次對話中先執行過稽核。寫入檔案,切勿寫入對話。$secure-webapp update:透過執行npx --yes github:hov172/secure-webapp-skill --global自行更新此安裝。它會進行版本檢查,僅在存在較新版本時才重新安裝。標誌:--claude/--codex/--gemini、--check、--force。$secure-webapp maintain:從原始碼儲存庫的複本更新技能套件本身 — 請參閱scripts/README.md。
僅載入任務所需的參考資料。切勿一次全部載入。
路由
| 任務涉及 | 載入項目 |
|---|---|
| 未受信任的字串被解釋為 HTML/DOM/SQL/shell/NoSQL/LDAP/regex/CSV | references/input-handling.md |
| 登入、註冊、密碼、MFA、重設、暴力破解、工作階段、Cookie、登出 | references/auth-and-sessions.md |
| 權限、角色、所有權檢查、IDOR、租戶隔離 | references/authorization.md |
| JWT、API/重新整理令牌、簽章與驗證、OAuth/OIDC、PKCE、state | references/tokens-and-oauth.md |
| REST/GraphQL/WebSocket 端點、速率限制、大量賦值、回應形狀、上傳/下載、路徑遍歷、預先簽署的 URL | references/apis-and-files.md |
| Secure/HttpOnly/SameSite、CSP、CORS、CSRF、標頭、iframe、postMessage | references/frontend-and-headers.md |
環境變數、.env、金鑰、密碼管理器、除錯模式、預設值 | references/secrets-and-config.md |
| 加密、密碼雜湊、演算法、金鑰管理、PII | references/data-and-crypto.md |
| 相依性、鎖定檔案、SBOM、CI/CD、GitHub Actions、簽署的成品 | references/supply-chain.md |
| 使用者控制的外部 URL、SSRF、競爭條件、反序列化、原型污染 | references/secure-coding.md |
| 日誌、錯誤回應、堆疊追蹤、稽核軌跡、失敗關閉、回滾 | references/logging-and-errors.md |
| 新功能設計、威脅模型、多租戶、安全設計決策 | references/insecure-design.md |
| LLM/AI 功能、提示建構、RAG、代理工具呼叫、MCP 伺服器、模型輸出的渲染或執行 | references/ai-and-llm.md |
常駐監控清單
在網頁程式碼中看到以下問題時,順便標記出來,並提供一個具體的修復方式:
- 資源路由缺少伺服器端授權/所有權檢查。建議使用查詢層級的作用域,例如
WHERE owner_id = :current_user。 - 硬編碼的密碼、憑證、JWT 密碼、API 金鑰,或已提交的
.env檔案。 - 使用字串拼接的 SQL/NoSQL/shell 查詢。應使用參數化查詢、安全建構器或 argv API。
- 純文字或快速雜湊的密碼。應使用 argon2id、scrypt 或 bcrypt;僅在必要時使用 PBKDF2。
- JWT 驗證時未固定演算法、缺少
exp/iss/aud檢查,或在程式碼中洩漏密碼。 dangerouslySetInnerHTML、v-html或innerHTML使用了使用者內容。應以文字形式渲染或進行消毒。- 帶有憑證的 CORS 使用了萬用字元或回顯來源。應使用嚴格的允許清單。
- 登入、註冊、重設、MFA/OTP 或高成本端點缺少速率限制。
- 在正式環境中向用戶端暴露詳細的錯誤訊息、堆疊追蹤、SQL/ORM 詳細資訊或除錯模式。
- 來自未經驗證的
next、returnTo或 URL 參數的開放式重定向。 - 使用者提供的 URL 導致 SSRF,且未使用允許清單,也未在 DNS 解析和重定向後阻擋私有 IP。
- 日誌中包含密碼、令牌、工作階段 ID、密碼或不必要的 PII。
- 僅在用戶端實施的安全控制:隱藏欄位、禁用按鈕、用戶端角色聲明、前端專屬驗證。
- 檔案上傳缺乏大小、類型、路徑、儲存或產生名稱的控制。
- 身份驗證、授權、速率限制、功能開關或交易周圍的失敗開放例外路徑。
- 非原子性的餘額、配額、付款、庫存、優惠券或一次性令牌狀態變更。
- 模型/LLM 輸出未經檢查就傳遞到像
innerHTML、shell、SQL、檔案路徑、fetchURL 或下游代理這類的接收端。應將其視為不受信任的輸入。 - 代理工具呼叫是針對服務帳戶而非終端使用者進行授權,或使用了通用的
run_shell/execute_sql/http_request工具,這會將提示注入轉變為 RCE、SQLi 或 SSRF。 - 將不受信任的文字串聯進系統提示;或將密碼或其他使用者的資料放入模型上下文。
- 可變的相依性或 CI 動作參考,在預期應使用固定版本和鎖定檔案的情況下 — 被移動的標籤會讓攻擊者在該工作中以該工作的密碼執行程式碼。當該工作持有部署憑證、簽署金鑰或發佈權限時,評定為高風險;對於存在 OIDC 的長期雲端憑證也是如此。稽核單一儲存庫中的每個工作區,並標記任何低於
high的--audit-level。
行為
- 預設編寫安全程式碼,無需冗長說明。在必要時簡短說明安全相關的選擇。
- 根據應用程式的風險等級調整嚴謹度;不要將企業級控制項強加於一次性原型。
- 絕不生成故意不安全的程式碼。提供安全的等效方案,並用一句話說明限制條件。
- 對於新的信任邊界功能,檢查:不受信任的輸入、授權、失敗模式、儲存的資料、濫用路徑。
- 進行稽核時,檢查實際程式碼,僅詢問必要的範圍界定問題,並報告嚴重性、位置、證據及修復方式,且應按優先順序排列。
- 除非被問到,否則不要引用 OWASP 需求編號。
- 不要聲稱進行滲透測試;這僅是程式碼與設計審查。
範圍
主流網頁技術棧 — Next.js、Express、Django、Flask、FastAPI、Rails、Spring、Laravel、Go 及類似技術。對於參考資料未涵蓋的特定領域,請說明情況並指向相關的 OWASP 來源,而非自行猜測。
與代理無關:適用於 Claude Code、Codex、Gemini CLI 以及其他任何載入技能或讀取 AGENTS.md/GEMINI.md 的工具。當此檔案提及某個工具時,請使用您環境中的等效工具。