ENGINEERING WORKFLOW · 70
Input / Secrets / Trust Boundary:不要相信 Client,也不要把高權限 Secret 下放
安全不是在程式最後加一個 if。真正的起點是辨認 trust boundary:哪些 input 不可信、哪些 identity 已驗證、哪些 credential 可公開、哪些 operation 需要 server/database 再 enforce。
Learning outcomes
- 能把 Browser input 視為不可信資料。
- 能區分 validation、authentication、authorization。
- 能辨識 public config 與 privileged secret。
- 能解釋 parameterized query 與 context-specific escaping。
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 constraintsBrowser 只持有 public config;privileged credential 留在 trusted environment。
Debug evidence:Secret 已 commit 到 Git
把檔案刪掉或改成 env 不代表歷史 commit 裡的 credential 自動失效。事件處理通常先 rotate/revoke,再清理暴露來源與 history。
Knowledge check
- required attribute 為何不能當 server validation?
- Authentication 和 authorization 差在哪?
- env var 為何不一定是 secret?
- 解釋 parameterized query 降低 injection risk 的原因。