簡單設計出安全的網頁程式的七個原則
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點也要時常確認有沒有注意到