# 策展 · X (Twitter) 🔥🔥

> 作者：darkzodchi (@zodchiii) · 平台：X (Twitter) · 日期：2026-05-01

> 原始來源：https://x.com/zodchiii/status/2049779422291460576

## 中文摘要

# 能防止 Claude Code 外洩你機密資訊的 .env 設定（包含完整設定檔）

Claude Code 在開啟專案的瞬間，就會讀取你的 .env 檔案。

你的 API keys、資料庫密碼、Stripe token，以及 .env 檔案中的所有內容，都會被載入記憶體，並可能最終出現在傳送給 Anthropic 伺服器的對話紀錄中。

唯一能真正阻擋存取的關鍵，是 settings.json 中的一行設定，但大多數人並沒有設定，甚至根本不知道它的存在。

以下是完整的安全性設定 👇

在深入探討之前，我會在我的 Telegram 頻道分享關於 AI 與 vibe coding 的每日筆記：https://t.me/zodchixquant🧠

![](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/1777637391385-iaHHI3YTuXkAAlC41jpg.jpg)

## 為什麼 CLAUDE.md 的規則無法保護你

大多數人會在他們的 CLAUDE.md 中加入「永遠不要讀取 .env 檔案」，並以為這樣就安全了（其實不然）。

CLAUDE.md 只是一個建議。Claude 大多數時候會遵守，但在壓力下（例如處理複雜任務、長 context、模糊的指令時），它完全可能且確實會忽略這些建議性質的規則。

2026 年 4 月的一個 GitHub issue 證實：即使 CLAUDE.md 明確禁止，Claude 仍然會讀取並將 .env 的內容回傳到對話中。

唯一可靠的保護方式，是在 settings.json 中設定拒絕規則（deny rule）。拒絕規則是在系統層級強制執行的，在 Claude 看到檔案之前就會先被攔截。

這就是「請不要讀取這個」與「你物理上無法讀取這個」之間的差別。

![](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/1777637391390-diaHHI3vVNWAAA8dgjpg.jpg)

## 你的機密資訊外洩的三種途徑

這不僅僅是 Claude 直接讀取 .env 的問題。外洩途徑主要有三種：

1. **直接讀取檔案**：Claude 掃描你的專案，開啟 .env，其內容隨即成為對話 context 的一部分。這是最顯而易見的途徑，也是最容易透過拒絕規則阻擋的。

2. **執行時期的輸出擷取**：Claude 執行你的測試或啟動你的應用程式。如果發生 HTTP 請求失敗，記錄檔可能會顯示完整的 `Authorization: Bearer sk-live-abc123...` 標頭；資料庫逾時則可能傾印出包含密碼的連線字串。Claude 會擷取所有指令輸出，因此即使 Claude 從未開啟過 .env，你的機密資訊也已經進入了對話中。

3. **Grep 與搜尋工具**：Claude 使用 grep 在你的程式庫中搜尋函數名稱。如果搜尋結果命中了包含憑證的設定檔，grep 的輸出就會包含匹配到的行數，導致你的機密資訊直接可見。

大多數人只防範了第 1 種途徑。但第 2 種和第 3 種途徑才是真正造成傷害的地方。

## 真正有效的拒絕規則

將以下內容加入 `~/.claude/settings.json`，即可在所有專案中獲得全域保護：

```json
{
  "permissions": {
    "deny": [
      "Read(**/.env*)",
      "Read(**/.dev.vars*)",
      "Read(**/*.pem)",
      "Read(**/*.key)",
      "Read(**/secrets/**)",
      "Read(**/credentials/**)",
      "Read(**/.aws/**)",
      "Read(**/.ssh/**)",
      "Read(**/config/database.yml)",
      "Read(**/config/credentials.json)",
      "Read(**/.npmrc)",
      "Read(**/.pypirc)",
      "Write(**/.env*)",
      "Write(**/secrets/**)",
      "Write(**/.ssh/**)"
    ]
  }
}
```

這會阻止 Claude 讀取或寫入任何 .env 檔案、PEM 金鑰、SSH 金鑰、AWS 設定、憑證檔案以及 npm/PyPI token。`**` 通用字元代表它適用於你專案中的每一個子目錄。

## 阻擋執行時期的外洩

拒絕規則可以阻止直接讀取檔案，但無法阻止執行時期的輸出。針對這一點，請使用包含虛擬值的測試專用 .env 檔案：

```
# .env.test — 可安全讀取，外洩也不怕
STRIPE_SECRET_KEY=sk_test_not_a_real_key
DATABASE_URL=postgres://test:test@localhost:5432/testdb
OPENAI_API_KEY=sk-test-dummy-key-for-mocking
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
```

將你的測試框架指向 `.env.test` 而非 `.env`。現在，當 Claude 執行測試並擷取輸出時，可見的只有虛擬金鑰。

## 能攔截所有問題的 pre-commit hook

即使有了拒絕規則，錯誤仍可能發生。請加入一個 git pre-commit hook，在任何 commit 進入你的儲存庫之前掃描機密資訊：

```bash
#!/bin/bash
# .git/hooks/pre-commit — 阻擋包含機密資訊的 commit

PATTERNS=(
  'sk-ant-'           # Anthropic API keys
  'sk-live-'          # Stripe live keys
  'sk_live_'          # Stripe live keys (alt format)
  'ghp_'              # GitHub personal tokens
  'gho_'              # GitHub OAuth tokens
  'AKIA'              # AWS access keys
  'xox[bpors]-'       # Slack tokens
  'SG\.'              # SendGrid keys
  'eyJ'               # JWTs
  'BEGIN.*PRIVATE KEY' # Private key material
)

BLOCKED_FILES=('.env' 'credentials.json' 'id_rsa' '*.pem' '*.key')

for pattern in "${PATTERNS[@]}"; do
  if git diff --cached --diff-filter=ACM | grep -qE "$pattern"; then
    echo "BLOCKED: Found potential secret matching '$pattern'"
    echo "Remove the secret and try again."
    exit 1
  fi
done

for file in "${BLOCKED_FILES[@]}"; do
  if git diff --cached --name-only | grep -q "$file"; then
    echo "BLOCKED: Attempted to commit sensitive file: $file"
    exit 1
  fi
done

echo "Pre-commit security check passed."
exit 0

```

使其可執行：`chmod +x .git/hooks/pre-commit`

這會攔截 Anthropic API keys、Stripe keys、GitHub tokens、AWS keys、Slack tokens、SendGrid keys、JWTs 以及私鑰資料。如果這些內容出現在暫存檔案中，commit 就會被阻擋。

## 容器隔離（終極手段）

為了達到最高安全性，請在容器內執行 Claude Code，讓 .env 檔案根本不存在於該環境中：

```bash
# 將 /dev/null 掛載到 .env，讓 Claude 看不到它
docker run -v /dev/null:/app/.env:ro your-dev-container
```

從 Claude 的角度來看，.env 是一個空檔案。你的機密資訊永遠不會進入容器的檔案系統。這對大多數專案來說可能太過謹慎，但對於處理生產環境憑證的客戶專案來說，這是必要的。

## 完整的安全性設定（可直接複製貼上）

以下是包含所有安全性保護的完整 `~/.claude/settings.json`：

```json
{
  "permissions": {
    "allow": [
      "Read",
      "Glob",
      "Grep",
      "LS",
      "Edit",
      "MultiEdit",
      "Write(src/**)",
      "Write(tests/**)",
      "Bash(npm run *)",
      "Bash(npm test *)",
      "Bash(npx tsc *)",
      "Bash(git status)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Bash(git add *)",
      "Bash(git commit *)"
    ],
    "deny": [
      "Read(**/.env*)",
      "Read(**/.dev.vars*)",
      "Read(**/*.pem)",
      "Read(**/*.key)",
      "Read(**/secrets/**)",
      "Read(**/credentials/**)",
      "Read(**/.aws/**)",
      "Read(**/.ssh/**)",
      "Read(**/config/database.yml)",
      "Read(**/config/credentials.json)",
      "Read(**/.npmrc)",
      "Read(**/.pypirc)",
      "Write(**/.env*)",
      "Write(**/secrets/**)",
      "Write(**/.ssh/**)",
      "Write(.github/workflows/*)",
      "Bash(rm -rf *)",
      "Bash(sudo *)",
      "Bash(git push *)",
      "Bash(npm publish *)",
      "Bash(curl * | sh)",
      "Bash(wget *)",
      "Bash(chmod *)"
    ],
    "defaultMode": "acceptEdits"
  }
}
```

這是上一篇文章中的 settings.json 加上本文所有安全性規則的整合版本。Allow 規則用於日常工作流程，Deny 規則用於保護機密資訊與防止危險操作。一個檔案，全面保護。

## 檢查清單

在下一次使用 Claude Code 之前：

1. 你是否在 settings.json 中設定了 .env 檔案的拒絕規則？

2. 你的測試是否使用了包含虛擬值的 .env.test？

3. 是否有 pre-commit hook 在掃描機密資訊模式？

4. 生產環境憑證是否儲存在保險庫中，而非純文字檔案？

5. .env 是否已加入你的 .gitignore？

6. .env 檔案是否放在專案目錄之外以獲得額外保護？

如果你完成了這 6 項檢查，你的機密資訊已獲得最大程度的保護。如果你一項都沒做，你只需要一個模糊的 Claude prompt，你的 API keys 就可能出現在 Anthropic 伺服器的對話紀錄中。

我會在我的 Telegram 頻道分享關於 AI、金融與 vibe coding 的每日筆記：https://t.me/zodchixquant

感謝閱讀🙏🏼

![](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/1777637391396-iaHHI5egJXgAAo7GEjpg.jpg)

## 標籤

Claude Code, CLI, 資安, 教學資源, Anthropic, Claude
