{ "_meta": { "用途": "機密遮蔽規則(9 條)的唯一權威資料來源,供 Python/JavaScript/Bash 三語言各自載入套用。任何實作異動一律先改本檔,再同步對應語言的實作。", "來源": "抽自 doc/scripts/worklog/transcript.py 的 REDACT_PATTERNS,並比對 persona/scripts/persona-lib.mjs 的 redactSecrets() 確認語意一致。", "語法規則": "pattern 一律使用三語言可直接使用的正則語法:不使用 Python 專屬語法特性(例如 (?i) inline flag、\\d 的 Unicode 語意),大小寫不分的規則改用顯式字元類別(如 [Tt][Oo][Kk][Ee][Nn])展開;數字一律用 [0-9] 而非 \\d。\\b/\\s/\\S 為 Python re、JavaScript RegExp 皆直接支援的語法,Bash 端以 GNU grep -E/sed -E(glibc regex,支援 \\b、\\s 等 GNU 擴充)套用。", "反向參照規則": "replacement 內的反向參照統一用 $1 風格(JavaScript String.replace/Bash sed 皆可直接使用)。Python 使用本檔時,套用前需先把 replacement 內的 $1、$2…轉成 \\1、\\2… 再交給 re.sub();transcript.py 的 REDACT_PATTERNS 保留原有 \\1 寫法不受本檔影響。", "更新時間": "2026/08/11 00:00:00" }, "rules": [ { "pattern": "[A-Za-z0-9_-]*:[A-Za-z0-9_-]{16,}@", "replacement": "***@", "purpose": "URL 內嵌憑證(user:token@ 形式)" }, { "pattern": "\\b[0-9a-f]{40}\\b", "replacement": "***", "purpose": "Gitea 40 字元 hex token" }, { "pattern": "\\bgh[pousr]_[A-Za-z0-9_]{16,}\\b", "replacement": "***", "purpose": "GitHub token(ghp_/gho_/ghu_/ghs_/ghr_ 開頭)" }, { "pattern": "\\bsk-[A-Za-z0-9_-]{16,}\\b", "replacement": "***", "purpose": "API key(sk- 開頭)" }, { "pattern": "\\b([Tt][Oo][Kk][Ee][Nn]|[Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd]|[Pp][Aa][Ss][Ss][Ww][Dd]|[Pp][Ww][Dd]|[Ss][Ee][Cc][Rr][Ee][Tt]|[Aa][Pp][Ii][_-]?[Kk][Ee][Yy])\\b\\s*[:=]\\s*\\S+", "replacement": "$1=***", "purpose": "key=value 形式機密(token/password/passwd/pwd/secret/api_key,不分大小寫)" }, { "pattern": "[Aa][Uu][Tt][Hh][Oo][Rr][Ii][Zz][Aa][Tt][Ii][Oo][Nn]:\\s*([Tt][Oo][Kk][Ee][Nn]|[Bb][Ee][Aa][Rr][Ee][Rr])\\s+\\S+", "replacement": "Authorization: $1 ***", "purpose": "HTTP Authorization 標頭(token/bearer,不分大小寫)" }, { "pattern": "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}", "replacement": "***", "purpose": "Email 位址" }, { "pattern": "\\b09[0-9]{2}[-\\s]?[0-9]{3}[-\\s]?[0-9]{3}\\b", "replacement": "***", "purpose": "台灣手機號碼" }, { "pattern": "\\b[A-Z][12][0-9]{8}\\b", "replacement": "***", "purpose": "台灣身分證字號" } ] }