簡單設計出安全的網頁程式的七個原則

Yotlin
Parenting 數位研發
Mar 30, 2022
1.Client不可信

所有來自於Client的輸入,包括ajax都不應該直接輸出在畫面上,直接帶入SQL語句,造成XSS及SQLinjection問題。

如果是對外的api,要注意有沒有機會被亂打,必要時要鎖ip或是透過未對外的後端先取得訪問權限。

認真的過濾每一個requset內容,但也要注意不要給過多的錯誤提示,讓攻擊者方便找出規則。

2.一次性

表單要押csrf token,每送一次,就要換一次,其他不該重複能送出的頁面,也要阻擋重複request。

有的request會跑的比較久,使用者會耐不住性去按重整,此類型頁面處理和輸出結果最好要分開,例如:一個匯出excel的功能,按下匯出鍵後,應該丟去另一個地方處理,在處理完成前,不允許再次請求(狀態鎖),完成後可以另外通知,或是設計ajax輪詢結果。

3.凡走過不留下痕跡

前端溝通,應避免曝露重要資訊在URL上,舉凡email 或某個重要ID,除了會留下紀錄外,也會引來駭客的眼光。

不必要的內容,不要出現在原始碼和API上。

4.確實登出/登入

登出時,確實失效session及相關token。

登入時,確實限制只屬於該帳號瀏覽的權限。

切換帳號時,注意同session下,同時開著多頁面下的操作,是否會踩到仍用前一個帳號操作(存檔)的問題。

5.動線限制

網站不是一條水管,沒有辦法限制使用者的訪問順序,如果一定要有順序性的操作,應善用session控制,避免不合理的訪問,造成結果異常。

6.善用押碼

當你不希望使用者在未透過正常訪問下取得某個url,例如換一個流水號ID就猜中url,但你又不得不用這個ID溝通時,你可以善用如MD5的單向編碼技術

Ex :id=15

$key='你的密鑰'

押碼 $mac=md5(‘15’ . $key) ,輸出的url 換成xxx?id=15&mac=押碼結果

在該url的程式內比對 押碼結果和id是否符合

$_get['mac']==md5($_get[‘mac’].$key),也可以在mac上押有效時間,加強限制。

7.攻擊自己

道高一尺,魔高一丈,不知道怎麼攻擊,就不知道怎麼防範,請時常攻擊自己。

Ex:常見的問題 如search 功能必測帶入% 或*,分頁筆數參數必測999999或-1,search的keyword是不是沒經過xss過濾就輸出在頁面上

上面1–6點也要時常確認有沒有注意到

--

--

Yotlin
Parenting 數位研發

22年以上 Web 全端工程師經驗,目前任職於親子天下數位研發中心技術部,帶領團隊共同成長