← Engineering Workflow

ENGINEERING WORKFLOW · 70

Input / Secrets / Trust Boundary:不要相信 Client,也不要把高權限 Secret 下放

安全不是在程式最後加一個 if。真正的起點是辨認 trust boundary:哪些 input 不可信、哪些 identity 已驗證、哪些 credential 可公開、哪些 operation 需要 server/database 再 enforce。

Learning outcomes

1. Client validation 是 UX,不是安全邊界

<input
  type="number"
  min="0"
  max="100"
  required
>

使用者可以用 DevTools、curl、API client 直接繞過 HTML。Server 與 Database 仍應驗證資料。

2. Validation / Authentication / Authorization

request data
  ↓ validate
credential
  ↓ authenticate
identity + resource
  ↓ authorize
business operation

「知道你是誰」和「允許你改這筆資料」是兩個不同問題。

3. Public config vs privileged secret

PUBLIC_API_URL
PUBLIC_PROJECT_ID

DATABASE_ADMIN_SECRET
DEPLOY_API_TOKEN

是否敏感取決於洩漏後的能力與 blast radius,不是取決於它是不是 environment variable。

4. SQL injection:資料不要拼成程式碼

// unsafe idea
"SELECT * FROM users WHERE name='" +
userInput + "'"
// parameterized concept
query(
  "SELECT * FROM users WHERE name = ?",
  [userInput]
);

Parameterized query 讓 SQL structure 和 data 分離。

5. Output context 也不同

HTML、URL、SQL、JavaScript string 的 escaping/encoding 規則不同。不存在一個萬能 sanitize function 能自動適用所有 context。

Project checkpoint:Course Workspace v9

Browser input
  ↓
server validation
  ↓
verified identity
  ↓
authorization
  ↓
parameterized query
  ↓
database constraints

Browser 只持有 public config;privileged credential 留在 trusted environment。

Debug evidence:Secret 已 commit 到 Git

把檔案刪掉或改成 env 不代表歷史 commit 裡的 credential 自動失效。事件處理通常先 rotate/revoke,再清理暴露來源與 history。

Knowledge check

  1. required attribute 為何不能當 server validation?
  2. Authentication 和 authorization 差在哪?
  3. env var 為何不一定是 secret?
  4. 解釋 parameterized query 降低 injection risk 的原因。