Communitygithub.com

bucai2417/安全系统开发规范

针对网站、后端或API的设计、编写或审查,提供安全与工程红线:强化认证、注入防御、业务逻辑与竞态防护、高并发数据库设计、异步优先架构、接口完整性防篡改、密钥与运维、AI/LLM安全、移动端与小程安全、CORS和安全头,以及场景感知的404与收录规则。

安全系统开发规范 是什麼?

这是一个全面的安全系统开发技能,适用于AI Agent(如Claude Code、Coder、Codex等)在使用时自动应用安全红线。它定义了设计、编写或审查任何网站、后端、API、移动端或AI应用时的硬性安全要求,涵盖认证会话、注入与输出、数据并发、业务逻辑、异步架构、接口完整性、AI/LLM安全、移动端/小程序安全、HTTP路由和SEO等18类规则。该技能还包含可执行的自查脚本(`scan_redlines.py`),用于扫描代码中的常见问题,如拼接SQL、硬编码密钥、未校验上传路径等,并支持CI集成。用户只需在任务前根据项目类型(公开站点、后台、API等)阅读对应章节,无需全量背诵,大大降低了安全盲区。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/bucai2417/secure-system-development/tree/HEAD

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

安全系统開發規範 / Secure System Development

若執行環境存在全域資產禁令(禁止攻擊/掃描某些自有資產),以全域配置為準,本 skill 不覆蓋它。 需要通用範本時見 references/internal-policy.example.md(發布版不含任何真實內部地址)。

使用方式

寫程式碼前先讀「紅線清單」,寫完自查;設計與評審時讀「階段一」;涉及具體模組時按指標打開 references/ 下對應檔案。提交前跑「上線前評審」,上線後看「運行時與 0day」。

如果一個任務只涉及其中一塊(比如只寫一個登入介面、只設計一張訂單表),只讀對應章節和對應 reference,不要全量背誦。

可執行自查(推薦先跑)

python scripts/scan_redlines.py <目標目錄> --format text            # 人讀
python scripts/scan_redlines.py <目標目錄> --format sarif --fail-on high   # CI 阻斷
python scripts/scan_redlines.py <目標目錄> --code-only              # 跳過文件,只掃程式碼

純 Python 標準庫,無需安裝依賴。覆蓋拼接 SQL、innerHTML/eval、CORS 通配與反射、全域 fallback 到首頁、硬編碼金鑰、MD5 存密碼、命令注入、關閉憑證驗證、除錯開關、敏感欄位入日誌、上傳路徑未驗證等 18 類規則。命中結果會指向對應 reference。

誤報處理:在那一行末尾加註解 redline: ignore(整行忽略)或 redline: ignore SQL001(只忽略指定規則)。不要為了消警而關閉整個規則——記下理由,評審時說明。

兩個範本:assets/threat-model-template.md(設計期威脅建模)、assets/review-checklist.md(按專案型別的上線前勾選)。

先判定專案型別(決定哪些規則適用)

場景典型型別安全規則完整性要求收錄(SEO)
公開站點官網、落地頁、部落格、文件、商城前台全套低(內容公開)必須做:真 404、sitemap、canonical、結構化資料
登入後產品SaaS、工具站、社群使用者端全套 + 完整帳號體系中(敏感操作簽名)只提交公開頁(營銷/幫助中心);私有頁 noindex
管理後台admin、運營後台、客服/審核系統全套 + 獨立入口 + MFA + 審計日誌高(全部寫操作簽名 + 審計)禁止收錄:整站 noindex + 強制鑑權
內部/個人系統內部平台、自用工具、腳本面板、家庭 NAS認證 + 最小暴露 + 限流 + 及時更新中(視暴露面)禁止收錄;不放公網預設路徑,不靠「隱蔽」當安全
純 APIREST / GraphQL / 服務間呼叫鑑權 + 輸入校驗 + 限流 + 版本管理按業務定(支付/資金類必高)不適用(不產生頁面)

判定問題只有一個:這個 URL 應不應該出現在搜尋引擎裡?

  • 應該 → 按公開站點執行,SEO 章節全套生效。
  • 不應該 → 執行「禁止收錄」:全站 X-Robots-Tag: noindex、robots 禁止抓取、強制鑑權。不要把 SEO 最佳化(sitemap、canonical、結構化資料)套到後台或個人系統上,那是浪費且會暴露攻擊面。
  • 無論哪類場景,「不存在的路徑返回真 404」都要遵守——那是 HTTP 正確性,不是 SEO。

五條底層原則

  1. 一切輸入不可信:URL、query、body、header、cookie、上傳檔案、Webhook、訊息佇列、第三方 API 回傳值、甚至資料庫裡歷史髒資料。
  2. 預設拒絕(fail closed):鑑權/校驗/解析出錯時返回拒絕,而不是放行;異常路徑不能走到「跳過校驗」的分支。
  3. 最小權限:資料庫帳號按功能分權(讀寫分離、不給 DDL),雲 IAM/物件儲存按前綴授權,行程用非 root,容器唯讀檔案系統。
  4. 縱深防禦:一層防不住時下一層還在。前端校驗是體驗,服務端校驗才是安全;WAF 是兜底,不是替代品。
  5. 限制爆炸半徑:0day 無法靠程式碼規約消除,靠隔離、限權、出站白名單、快速修補通道把損失壓到最小。

紅線清單(硬性,逐條自查)

認證與會話

  • 密碼用 Argon2id/bcrypt(cost≥12)/scrypt 雜湊,禁止 MD5/SHA1/可逆加密
  • 登入失敗按「帳號+IP」雙維度限速,漸進延遲,必要時驗證碼/臨時鎖定
  • 登入/註冊/找回密碼的回應文案與耗時一致,不洩露帳號是否存在
  • 登入成功後輪換 session id(防會話固定),Cookie 帶 HttpOnly + Secure + SameSite
  • JWT 服務端固定演算法白名單,拒絕 alg:none 與演算法混淆;短有效期 + refresh 輪換 + 可撤銷
  • 認證 ≠ 授權:每個介面顯式校驗「當前使用者能否操作這個物件」(防 IDOR/越權)

注入與輸出

  • 所有 SQL 用參數化查詢/ORM 繫結,禁止字串拼接;表名/排序欄位走白名單對映
  • 禁止把使用者輸入拼進 shell/命令,用參數陣列的 execFile 系列
  • 輸出按上下文編碼;dangerouslySetInnerHTML/v-html/innerHTML 必須過 DOMPurify 等 sanitizer
  • 富文字、Markdown、URL 參數一律白名單化,不信任任何前端過濾
  • 出站請求(SSRF)走白名單,禁止跟隨任意重定向,攔截內網/元資料地址(169.254.169.254、127.0.0.1、10/8、172.16/12、192.168/16、::1、file://、gopher://)
  • 檔案路徑用 path.resolve 後校驗前綴,拒絕 ..;上傳檔案隨機命名、型別嗅探、隔離儲存、無執行權限

資料與併發

  • 核心寫操作冪等(唯一索引 / 冪等鍵),下單、支付、回撥必須冪等
  • 庫存、餘額、次數類欄位用條件更新 UPDATE ... WHERE 餘量 >= ?,禁止先查後改
  • 事務短小,事務內禁止網路呼叫、發訊息、渲染範本
  • 新增查詢必須 EXPLAIN 過;禁止大 offset 分頁、SELECT *、N+1 查詢
  • 金額用整數分或 DECIMAL,禁止 float/double

非同步與穩定性

  • 所有外部呼叫(HTTP/DB/Redis/MQ)顯式配逾時,禁止無限等待
  • 重試只用於冪等操作,指數退避 + 抖動 + 次數上限
  • 訊息消費冪等(message_id 去重表),失敗進死信佇列並告警
  • 關鍵狀態變更先落庫再發訊息(Outbox/事務訊息),不允許雙寫

業務邏輯與競態(最常被漏掉的一類)

  • 價格、金額、折扣、權限等級一律服務端計算,客戶端提交值只做展示
  • 優惠券/兌換碼/邀請碼繫結使用者與次數,原子核銷(條件更新或唯一約束)
  • 狀態機顯式校驗:非法躍遷直接拒絕(如 pending 繞過支付回撥直接變 paid)
  • 資金/回撥介面校驗簽名 + 時間戳 + 冪等鍵,防重放與偽造
  • 限購、頻控按「使用者 + 裝置 + IP」組合判斷,不能只按其中一個維度繞過
  • 匯出、批次、搜尋介面限流 + 資料量上限 + 審計

金鑰與運維

  • 金鑰只放環境變數或金鑰管理服務,禁止進倉庫、映象層、前端 bundle、日誌、錯誤上報
  • CI/CD 憑證最小權限,生產部署需審批;第三方依賴鎖版本 + 掃描
  • 敏感操作(登入、改權、匯出、刪除、退款)寫審計日誌,業務程式碼不可篡改

介面完整性(防抓包改包 / 重放 / 偽造響應)

  • 支付、資金、授權、改密等敏感請求做簽名:HMAC(secret, method+path+sortedQuery+sha256(body)+timestamp+nonce),服務端重算
  • nonce 儲存去重(TTL = 時間窗),時間窗 ±300s,拒絕過期與重放
  • 敏感響應(支付結果、授權結果、餘額)帶服務端簽名,客戶端校驗;但真相永遠在服務端重查
  • 客戶端提交的任何「已校驗」標記、價格、角色都不作為真相源;服務端重算/重查
  • 行動端憑證固定;release 包禁止信任使用者憑證、禁止開啟除錯與抓包開關
  • 客戶端加固(混淆/加固/反除錯)只提高成本,不當安全邊界;金鑰不下發客戶端

AI / LLM 應用

  • 模型輸出視為不可信輸入:不 eval、不直接拼 HTML/SQL/命令、不直接執行工具參數
  • 工具/函式呼叫最小權限 + 參數 schema 校驗 + 高風險動作人工確認
  • RAG 檢索到的文件視為不可信內容,與系統提示隔離,防間接提示注入
  • 系統提示與使用者輸入分離;不把金鑰、內部規則放進可被誘導輸出的位置
  • 按使用者/租戶做成本與頻率限流;日誌脫敏(不記錄完整提示中的敏感資料)

行動端 / 小程式

  • 敏感資料存 Keychain(iOS) / Keystore(Android),不用明文 SharedPreferences
  • 傳輸強制 TLS + 憑證固定;InsecureSkipVerify/verify=False 一律禁止
  • WebView 關閉 file 訪問與 JS 橋暴露面,onShouldStartLoadWithRequest 做域名白名單
  • 小程式 session_key 只在服務端使用,絕不下發前端;code2session 後簽發自有會話
  • root/越獄檢測只作為風控訊號,不作為鑑權依據

HTTP 與路由(所有場景)

  • 不存在的路徑返回真正的 HTTP 404 + 404 頁面,禁止 302/200 跳首頁
  • SPA 的 history fallback 只對「已知前台路由」生效;/api、帶副檔名的靜態資源一律 404
  • CORS 用精確 Origin 白名單,禁止 Access-Control-Allow-Origin: * 搭配 credentials,禁止反射任意 Origin
  • 生產開啟安全響應頭:HSTS、CSP、X-Content-Type-Options、Referrer-Policy、frame-ancestors
  • 認證/敏感介面響應帶 Cache-Control: no-store
  • 錯誤響應不返回堆疊、SQL、框架版本、內部路徑

收錄(僅公開站點需要;後台/內部系統反過來做)

  • 公開站點:sitemap 只列 200 頁面、canonical 去重、robots 不洩露後台路徑、預發環境整站 noindex
  • 後台/內部/個人系統:整站 X-Robots-Tag: noindex + robots Disallow: /,不生成 sitemap,且必須鑑權(robots 不是訪問控制)

階段一:設計時

動手前用 5 分鐘做一次輕量威脅建模:

  1. 定場景:對照上面的專案型別表,確認這是公開站點、後台、內部系統還是 API;據此決定是否執行 SEO 章節、暴露面有多大。
  2. 畫資料流:使用者 → 閘道器 → 服務 → 資料庫/快取/MQ/第三方,標出每個跨越信任邊界的點。
  3. 列資產並分級:帳號、憑證、支付、個人資料、管理後台,分別問「誰能讀、誰能寫、被篡改的後果、保留多久」。
  4. 每個邊界問三件事:誰能到達?輸入是否校驗?失敗時是否預設拒絕?
  5. 定權限模型:角色 → 資源 → 動作,在服務端強制,前端隱藏按鈕不算;多租戶系統額外定隔離策略。
  6. 定非同步邊界:哪些操作必須同步返回(登入、支付確認),哪些可以非同步(通知、報表、匯出)。

設計文件裡至少要寫明:專案型別與收錄策略、認證方式、授權模型、敏感資料分級與加密、限流策略、冪等鍵、失敗降級方式、日誌與審計範圍。

階段二:實現時

認證與登入(最高優先順序)

登入是最容易被爆破、撞庫、繞過的入口。完整規則見 references/auth-and-session.md,核心不可妥協:

  • 限速分層:單 IP、單帳號、單裝置指紋;失敗計數用 Redis 過期鍵,不要只靠記憶體。
  • 錯誤資訊統一為「帳號或密碼錯誤」,耗時對齊(不存在帳號也走一次假雜湊,防時序列舉)。
  • 登入成功後重新生成會話標識;舊會話作廢。
  • 敏感操作(改密、改綁、提現、刪除)要求二次驗證或最近一次認證時間(re-auth 視窗)。
  • 密碼重置 token:高熵、一次性、短時效(≤15 分鐘)、繫結使用者與用途。
  • 管理後台獨立入口、獨立域名或 IP 白名單,不與使用者端共用會話。

輸入、注入與輸出

見 references/web-vulnerability-prevention.md。原則:入口統一校驗(schema),出口按上下文編碼。

// 輸入:用 schema 校驗,未知欄位拒絕,而不是「取需要的」
const LoginBody = z.object({ email: z.string().email(), password: z.string().min(8).max(128) }).strict();

// SQL:參數化,絕不拼接
await db.query('SELECT id, password_hash FROM users WHERE email = $1', [email]);
// 排序/表名這類無法參數化的位置:白名單
const orderBy = { created_at: 'created_at', amount: 'amount_cents' }[sort] ?? 'created_at';
  • XSS:React/Vue 預設轉義即可,危險 API 必須 sanitize;CSP 作為第二道防線。
  • 越權:查詢條件裡帶上 owner_id = $currentUser,不要「查出後在前端判斷」。
  • 反序列化/範本注入:不 eval,不把使用者輸入拼進範本/運算式/正則。
  • 上傳:限制大小與型別(按 magic bytes 嗅探)、隨機檔名、存物件儲存、圖片重編碼。

資料庫與高併發

見 references/database-concurrency.md。要點:

  • 索引先於最佳化:新查詢上線前 EXPLAIN,關注 type=ALL、filesort、臨時表。
  • 分頁用游標(keyset),不用深 offset;列表介面必須有穩定排序 + 上限。
  • 熱點寫用「條件更新 + 行鎖」,庫存扣減示例:
UPDATE sku SET stock = stock - $1, version = version + 1
WHERE id = $2 AND stock >= $1;
-- 影響行數為 0 → 庫存不足或併發衝突,按業務重試/失敗
  • 快取三件套:防穿透(空值快取/布隆過濾器)、防擊穿(互斥鎖/單飛)、防雪崩(TTL 加隨機抖動)。
  • 連線池上限要小於資料庫 max_connections / 例項數,並配置獲取逾時。
  • 規模上來再談分庫分表;先做索引、快取、讀寫分離、冷熱分離。

業務邏輯與競態

見 references/business-logic-and-race-conditions.md。這類漏洞沒有統一掃描器,只能靠設計時逐條想清楚:價格與金額服務端計算、優惠券原子核銷、狀態機校驗、防重放、限購維度、匯出限流。併發下的「先查後寫」一律改成條件更新或加鎖 + 冪等。

非同步優先架構

見 references/async-architecture.md。系統預設按非同步設計:

  • IO 全部非阻塞;Node 裡禁止在請求路徑上用同步 fs/crypto 和重 CPU 計算(用 worker_threads)。
  • 每個外部呼叫都要有逾時;呼叫鏈上傳遞 trace id。
  • 佇列消費 = 至少一次投遞,所以必須冪等;重試有上限,超限進 DLQ 並告警。
  • 跨服務一致性用 Outbox/CDC,不雙寫。
  • 長任務(匯出、批次、稽核)進佇列,介面立即返回任務 id,前端輪詢或 SSE 推送狀態。
  • 優雅停機:停止接新請求 → 等在途完成 → 關閉佇列消費者 → 關閉連線。

HTTP、路由、CORS 與 SEO

見 references/http-routing-cors-seo.md。三條最容易踩的:

  1. 404 必須是 404。不要全域 fallback 到首頁:SPA 只對構建期已知路由回落 index.html,/api/* 和帶副檔名的路徑直接 404。
  2. CORS 精確白名單,把 Origin 與配置項做集合相等,不 includes、不前綴匹配、不直接回顯請求頭。
  3. 狀態碼語義正確:401 未認證、403 無權限、404 不存在、409 衝突、422 校驗失敗、429 限流。

SEO 只對公開站點生效;後台與內部系統按上面場景表的「禁止收錄」執行,不要給它們加 sitemap、canonical、結構化資料——那是給爬蟲增加攻擊面。

金鑰、運維與郵件

見 references/operations-and-secrets.md。要點:金鑰分層存放與輪換、CI/CD 最小權限、容器非 root、物件儲存與雲 IAM 最小化、審計日誌不可篡改、郵件域配 SPF/DKIM/DMARC 防偽造、資料保留期與刪除流程。

介面完整性與防篡改

見 references/api-integrity-and-tampering.md。抓包改包和重放是行動端與開放 API 的頭號問題:請求簽名(HMAC + timestamp + nonce + body hash)、服務端重算、敏感響應簽名、nonce 去重、時間窗、憑證固定。記住:客戶端能改的一切都不可信,簽名只是提高門檻,服務端重算才是真相。

AI / LLM 應用安全

見 references/ai-llm-security.md。模型輸出等同於外部輸入:不執行、不直拼、不當 SQL/命令;工具呼叫最小權限 + schema 校驗 + 高風險人工確認;RAG 內容不可信;按租戶限流控成本。

行動端與小程式

見 references/mobile-and-miniprogram.md。Keychain/Keystore、憑證固定、WebView 加固、小程式 session_key 不下發、root 檢測僅作訊號。

階段三:上線前評審

按順序過一遍,任何一項「不確定」都按未通過處理:

  1. 紅線清單 100% 勾選;再按專案型別核對:公開站點查 SEO 項,後台/內部系統查 noindex 與入口隔離,敏感業務查介面完整性。
  2. 跑 python scripts/scan_redlines.py <目錄> --fail-on high,高危必須清零。
  3. 依賴掃描(npm audit / pip-audit / govulncheck / OWASP Dependency-Check),高危必須處理。
  4. 金鑰檢查:倉庫、映象、日誌、前端 bundle 裡不得出現金鑰;.env 不進版本庫;CI 日誌同樣要查。
  5. 容器/主機:非 root、唯讀根檔案系統、最小埠暴露、出站白名單。
  6. 監控與告警:登入失敗率、5xx、佇列積壓、慢查詢、異常出站請求。
  7. 備份與恢復演練;資料庫帳號最小權限。
  8. 壓測關鍵路徑(登入、下單、列表)確認限流與快取生效。
  9. 郵件域:SPF/DKIM/DMARC 配好,發信介面限流,避免被偽造發釣魚郵件或被當垃圾源。
  10. 資料生命週期:明確收集最小化、保留期、匯出與刪除流程;日誌脫敏後留存。
  11. 安全響應預案:誰負責、怎麼隔離、怎麼通知使用者、怎麼複盤。
  12. 合規對映(如需):對照 references/compliance-mapping.md 檢查 OWASP/ASVS/等保/PIPL 項。

階段四:運行時與 0day 緩解

程式碼規約防不住未知漏洞,靠以下手段限制影響:

  • 出站預設拒絕 + 白名單(SSRF、供應鏈回連的第一道牆)。
  • 關鍵服務沙箱/容器隔離,行程降權,seccomp/AppArmor 按需開啟。
  • 依賴鎖定版本 + 可快速重建映象;關注安全公告,預留緊急修補通道。
  • WAF/閘道器做通用特徵攔截與限流,但別只依賴它。
  • 行為監控:異常登入地理/裝置跳變、批次讀寫、異常出站流量。
  • 資料分級:敏感欄位加密儲存(AES-GCM/KMS),日誌脫敏,匯出需審批。

references 索引

檔案何時讀
references/auth-and-session.md登入、註冊、密碼、JWT、2FA、找回密碼、CSRF、越權、管理後台
references/web-vulnerability-prevention.mdSQL 注入、XSS、SSRF、上傳、路徑穿越、反序列化、響應頭、API 特有風險
references/business-logic-and-race-conditions.md價格/金額、優惠券、庫存、狀態機、TOCTOU 競態、限購、匯出濫用
references/database-concurrency.md建表、索引、事務、鎖、冪等、快取、讀寫分離、分庫分表
references/async-architecture.md逾時、重試、佇列消費、Outbox、背壓、優雅停機、可觀測性
references/http-routing-cors-seo.md404、狀態碼、CORS、快取、robots/sitemap、公開站點與後台的收錄分流
references/operations-and-secrets.md金鑰、CI/CD、容器雲、郵件域、審計日誌、資料生命週期、應急
references/api-integrity-and-tampering.md抓包改包、請求/響應簽名、重放防護、憑證固定、客戶端加固邊界
references/ai-llm-security.md提示注入、工具呼叫權限、RAG 投毒、模型輸出處理、成本限流
references/mobile-and-miniprogram.md本地儲存、憑證固定、WebView、小程式登入態、root 檢測
references/compliance-mapping.mdOWASP Top 10 / ASVS / 等保 2.0 / PIPL 對照,做審計或評審彙報
references/internal-policy.example.md需要自定義資產禁令範本時(佔位域名,不含真實地址)

交付約定

  • 每次交付程式碼時,在回覆裡用 3–6 行說明本次涉及的安全決策(校驗點、鑑權點、冪等鍵、限流、錯誤處理),不要略過。
  • 先說明專案型別:如果交付的是後台或內部系統,明確指出「不做 SEO,整站 noindex」;只有公開站點才輸出收錄相關配置。
  • 發現現有程式碼違反紅線時,直接指出位置並給出修復,不要只說「建議加固」。
  • 無法驗證的部分(例如未實際發起攻擊測試)明確寫「未驗證」,不要聲稱已通過安全測試。

相關技能