Claude Code 一打開你的專案,就會讀取你的 .env 檔案。
你的 API 金鑰、資料庫密碼、Stripe Token,所有在 .env 檔案裡的內容都會被載入記憶體,並可能出現在傳送到 Anthropic 伺服器的對話記錄中。
唯一能真正阻擋存取的,是 settings.json 裡的一行設定,而大多數人沒有設定它,甚至不知道它的存在。
以下是完整的安全設定 👇
在深入之前,我每天在 Telegram 頻道分享 AI 與 Vibe Coding 的筆記:**https://t.me/zodchixquant**🧠

為什麼 CLAUDE.md 規則無法保護你
大多數人在 CLAUDE.md 中加入「永遠不要讀取 .env 檔案」,就以為安全了(其實並沒有)
CLAUDE.md 只是建議。Claude 大部分時間會遵循,但在壓力下(複雜任務、長上下文、模糊指令),它可能會忽略建議性規則。
2026 年 4 月的一個 GitHub Issue 證實:即使 CLAUDE.md 明確禁止,Claude 仍然會讀取 .env 內容並將其帶入對話中。
唯一可靠的保護是在 settings.json 中設定拒絕規則。拒絕規則在系統層級強制執行,Claude 根本看不到檔案。
差別在於「請不要讀取這個」與「你根本無法讀取這個」。

你的秘密洩漏的 3 種方式
問題不僅在於 Claude 直接讀取 .env。有三條路徑:
1. 直接檔案讀取。 Claude 掃描你的專案,打開 .env,內容就變成對話上下文的一部分。這是最明顯的,也是最容易用拒絕規則阻擋的。
2. 執行輸出擷取。 Claude 執行你的測試或啟動你的應用程式。一次失敗的 HTTP 請求會記錄完整的 Authorization: Bearer sk-live-abc123... 標頭。一次資料庫超時會傾印包含密碼的連線字串。Claude 會擷取所有指令輸出。你的秘密現在就在對話中,即使 Claude 從未打開 .env。
3. Grep 與搜尋工具。 Claude 使用 grep 搜尋你的程式碼庫以尋找函式名稱。搜尋結果命中了一個包含憑證的設定檔。grep 輸出會顯示包含你的秘密的匹配行。
大多數人只防範路徑 1。路徑 2 和 3 才是真正造成損害的地方。
真正有效的拒絕規則
將以下內容加入 ~/.claude/settings.json,以獲得跨所有專案的全局保護:
json
1{2 "permissions": {3 "deny": [4 "Read(**/.env*)",5 "Read(**/.dev.vars*)",6 "Read(**/*.pem)",7 "Read(**/*.key)",8 "Read(**/secrets/**)",9 "Read(**/credentials/**)",10 "Read(**/.aws/**)",11 "Read(**/.ssh/**)",12 "Read(**/config/database.yml)",13 "Read(**/config/credentials.json)",14 "Read(**/.npmrc)",15 "Read(**/.pypirc)",16 "Write(**/.env*)",17 "Write(**/secrets/**)",18 "Write(**/.ssh/**)"19 ]20 }21}
這會阻止 Claude 讀取或寫入任何 .env 檔案、PEM 金鑰、SSH 金鑰、AWS 設定、憑證檔案以及 npm/PyPI Token。** 萬用字元表示它適用於你專案中的每個子目錄。
阻擋執行時洩漏
拒絕規則能阻止直接檔案讀取,但無法阻止執行輸出。為此,請使用包含虛擬值的測試專用 .env 檔案:
1# .env.test — 安全可讀,洩漏也無妨2STRIPE_SECRET_KEY=sk_test_not_a_real_key3DATABASE_URL=postgres://test:test@localhost:5432/testdb4OPENAI_API_KEY=sk-test-dummy-key-for-mocking5AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE6AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
將你的測試框架指向 .env.test 而非 .env。這樣當 Claude 執行你的測試並擷取輸出時,唯一可見的金鑰都是虛擬的。
能捕捉一切的 Pre-commit Hook
即使有拒絕規則,錯誤仍可能發生。加入一個 git pre-commit hook,在每次提交到達你的儲存庫之前掃描秘密:
bash
1#!/bin/bash2# .git/hooks/pre-commit — 阻止包含秘密的提交34PATTERNS=(5 'sk-ant-' # Anthropic API 金鑰6 'sk-live-' # Stripe 正式金鑰7 'sk_live_' # Stripe 正式金鑰(另一格式)8 'ghp_' # GitHub 個人 Token9 'gho_' # GitHub OAuth Token10 'AKIA' # AWS 存取金鑰11 'xox[bpors]-' # Slack Token12 'SG\.' # SendGrid 金鑰13 'eyJ' # JWT14 'BEGIN.*PRIVATE KEY' # 私鑰內容15)1617BLOCKED_FILES=('.env' 'credentials.json' 'id_rsa' '*.pem' '*.key')1819for pattern in "${PATTERNS[@]}"; do20 if git diff --cached --diff-filter=ACM | grep -qE "$pattern"; then21 echo "已阻擋:發現可能符合 '$pattern' 的秘密"22 echo "請移除秘密後再試。"23 exit 124 fi25done2627for file in "${BLOCKED_FILES[@]}"; do28 if git diff --cached --name-only | grep -q "$file"; then29 echo "已阻擋:嘗試提交敏感檔案:$file"30 exit 131 fi32done3334echo "Pre-commit 安全檢查通過。"35exit 0
讓它可執行:chmod +x .git/hooks/pre-commit
這會捕捉 Anthropic API 金鑰、Stripe 金鑰、GitHub Token、AWS 金鑰、Slack Token、SendGrid 金鑰、JWT 以及私鑰內容。如果這些內容出現在暫存檔案中,提交就會被阻止。
容器隔離(終極方案)
為了最高安全性,在容器內執行 Claude Code,讓 .env 檔案根本不存在:
bash
1# 將 /dev/null 掛載到 .env 上,讓 Claude 看不到它2docker run -v /dev/null:/app/.env:ro your-dev-container
從 Claude 的角度來看,.env 是一個空檔案。你的秘密永遠不會進入容器檔案系統。這對大多數專案來說有點過頭,但對於處理正式環境憑證的客戶專案來說是必要的。
完整安全設定(可直接複製貼上)
完整的 ~/.claude/settings.json,包含所有安全保護:
json
1{2 "permissions": {3 "allow": [4 "Read",5 "Glob",6 "Grep",7 "LS",8 "Edit",9 "MultiEdit",10 "Write(src/**)",11 "Write(tests/**)",12 "Bash(npm run *)",13 "Bash(npm test *)",14 "Bash(npx tsc *)",15 "Bash(git status)",16 "Bash(git diff *)",17 "Bash(git log *)",18 "Bash(git add *)",19 "Bash(git commit *)"20 ],21 "deny": [22 "Read(**/.env*)",23 "Read(**/.dev.vars*)",24 "Read(**/*.pem)",25 "Read(**/*.key)",26 "Read(**/secrets/**)",27 "Read(**/credentials/**)",28 "Read(**/.aws/**)",29 "Read(**/.ssh/**)",30 "Read(**/config/database.yml)",31 "Read(**/config/credentials.json)",32 "Read(**/.npmrc)",33 "Read(**/.pypirc)",34 "Write(**/.env*)",35 "Write(**/secrets/**)",36 "Write(**/.ssh/**)",37 "Write(.github/workflows/*)",38 "Bash(rm -rf *)",39 "Bash(sudo *)",40 "Bash(git push *)",41 "Bash(npm publish *)",42 "Bash(curl * | sh)",43 "Bash(wget *)",44 "Bash(chmod *)"45 ],46 "defaultMode": "acceptEdits"47 }48}
這是我上一篇文章中的 settings.json,再加上本文的所有安全規則。允許規則用於日常工作流程,拒絕規則用於保護秘密和危險操作。一個檔案,完整保護。
檢查清單
在你下一次使用 Claude Code 之前:
- 你的 settings.json 中是否有針對 .env 檔案的拒絕規則?
- 你的測試是否使用包含虛擬值的 .env.test?
- 是否有 pre-commit hook 掃描秘密模式?
- 正式環境憑證是否存放在保險庫中,而非純文字檔案?
- .env 是否在你的 .gitignore 中?
- 為了額外安全,.env 檔案是否放在你的專案目錄之外?
如果你勾選了全部 6 項,你的秘密就得到了最大程度的保護。如果你勾選了 0 項,那麼你離你的 API 金鑰出現在 Anthropic 伺服器上的對話記錄中,只差一個模糊的 Claude 提示。
我每天在 Telegram 頻道分享 AI、金融與 Vibe Coding 的筆記:**https://t.me/zodchixquant**
感謝閱讀🙏🏼






