開發觀念基礎
資安底線
資安在這一版不是加購章節。它是:誰可以按、秘密放哪、送來的字能不能直接信。
身份和權限不是同一件事
身份是「你是誰」。權限是「你這個人可以做哪一件事」。小安是客服,不代表她可以退每一張單;主管看得到週報,不代表他該擁有改訂單的鑰匙。FDE 要在範圍裡寫出:這個按鈕誰看得到,這個動作誰做了會被拒絕。
拒絕的時候要說人話,但拒絕本身要發生在後端。只把按鈕藏起來,等於把鎖畫在門上。知道網址的人還是進得來。藏按鈕是禮貌,檢查權限才是鎖。
秘密不進前端,輸入不能直接信
呼叫訂單系統的鑰匙、資料庫的通行、任何「拿到就能替別人做事」的東西,都不該出現在瀏覽器看得到的程式裡。前端需要的是一個已經被允許的結果,不是那把鑰匙。鑰匙進了前端,就等於放在每一台開過這個頁面的電腦上。
輸入也一樣。顧客寫的退貨原因、小安貼上的訂單編號,都是別人送來的字。它們可以當資料,不能當命令。不要因為句子裡寫著「這張單一定要退」,後端就照做。字要先被當成不可信的材料,再套進你們已經寫好的規則。
一個會出事的切法
有人為了少做一層,把退貨頁切成:畫面若判斷可退,就送出「同意退貨」;後端不看訂單,只負責把同意寫進資料庫。演示時很順,因為畫面永遠送出同意。出事的方式也很單純:任何人讓瀏覽器送出同意,就產生一筆退貨。沒有七天、沒有未拆封、也沒有「這個人是不是小安」。
改法不是把畫面做醜。改法是後端重新問訂單、重新算規則、重新看這個人的權限。畫面只送訂單編號和她勾的選項。選項是線索,不是判決。這就是這一課要你帶走的切法:線索可以來自分頁,判決不行。
範例 · 退貨頁上三樣不能放的東西
- 不能放:訂單系統的鑰匙。頁面只該呼叫你們自己的後端。
- 不能放:由畫面私自決定的「同意退貨」。它只能送編號和勾選。
- 不能放:把顧客自由輸入的句子直接當成指示。句子進資料庫可以,當成命令不行。
練習
檢查你心裡那個第一版,寫下三個問題:誰可以按、鑰匙在哪一層、哪個欄位是別人送來的字。
若鑰匙的答案是「在畫面上比較方便」,把這句劃掉,改寫成鑰匙放在後端、畫面只看到結果。
完成的時候
- 你能講出身份和權限的差別,並配一個退貨例子。
- 你能描述那個會出事的切法,以及判決為什麼必須回到後端。