3大Web安全漏洞防御詳解:XSS、CSRF、以及SQL注入解決方案
隨著互聯(lián)網(wǎng)的普及,網(wǎng)絡(luò)安全變得越來越重要,程序員需要掌握最基本的web安全防范,下面列舉一些常見的安全漏洞和對(duì)應(yīng)的防御措施。
01
常見的Web安全問題
1.前端安全
- XSS 漏洞
- CSRF 漏洞
2.后端安全
02
XSS漏洞
1.XSS簡(jiǎn)介
跨站腳本(cross site script)簡(jiǎn)稱為XSS,是一種經(jīng)常出現(xiàn)在web應(yīng)用中的計(jì)算機(jī)安全漏洞,也是web中最主流的攻擊方式。
XSS是指惡意攻擊者利用網(wǎng)站沒有對(duì)用戶提交數(shù)據(jù)進(jìn)行轉(zhuǎn)義處理或者過濾不足的缺點(diǎn),進(jìn)而添加一些代碼,嵌入到web頁面中去,使別的用戶訪問都會(huì)執(zhí)行相應(yīng)的嵌入代碼。
2.XSS攻擊的危害
1)盜取用戶資料,比如:登錄帳號(hào)、網(wǎng)銀帳號(hào)等
2)利用用戶身份,讀取、篡改、添加、刪除數(shù)據(jù)等
3)盜竊重要的具有商業(yè)價(jià)值的資料
4)非法轉(zhuǎn)賬
5)強(qiáng)制發(fā)送電子郵件
6)網(wǎng)站掛馬
7)控制受害者機(jī)器向其它網(wǎng)站發(fā)起攻擊
3.防止XSS解決方案
XSS的根源主要是沒完全過濾客戶端提交的數(shù)據(jù) ,所以重點(diǎn)是要過濾用戶提交的信息。
1)將重要的cookie標(biāo)記為http only, 這樣的話js 中的document.cookie語句就不能獲取到cookie了.
2)只允許用戶輸入我們期望的數(shù)據(jù)。 例如:age用戶年齡只允許用戶輸入數(shù)字,而數(shù)字之外的字符都過濾掉。
3)對(duì)數(shù)據(jù)進(jìn)行Html Encode 處理: 用戶將數(shù)據(jù)提交上來的時(shí)候進(jìn)行HTML編碼,將相應(yīng)的符號(hào)轉(zhuǎn)換為實(shí)體名稱再進(jìn)行下一步的處理。
4)過濾或移除特殊的Html標(biāo)簽, 例如:
5)過濾js事件的標(biāo)簽。例如 "onclick=", "onfocus" 等等。
03
CSRF攻擊(跨站點(diǎn)請(qǐng)求偽造)
1.CSRF簡(jiǎn)介
CSRF(Cross-site request forgery)跨站請(qǐng)求偽造,也被稱為“One Click Attack”或者Session Riding,通??s寫為CSRF或者XSRF,是一種對(duì)網(wǎng)站的惡意利用。
XSS主要是利用站點(diǎn)內(nèi)的信任用戶,而CSRF則通過偽裝來自受信任用戶的請(qǐng)求,來利用受信任的網(wǎng)站。與XSS攻擊相比,CSRF更具危險(xiǎn)性。
2.CSRF攻擊的危害
主要的危害來自于,攻擊者盜用用戶身份,發(fā)送惡意請(qǐng)求。比如:模擬用戶發(fā)送郵件,發(fā)消息,以及支付、轉(zhuǎn)賬等。
3.防止CSRF的解決方案
1)重要數(shù)據(jù)交互采用POST進(jìn)行接收,當(dāng)然是用POST也不是萬能的,偽造一個(gè)form表單即可破解。
2)使用驗(yàn)證碼,只要是涉及到數(shù)據(jù)交互就先進(jìn)行驗(yàn)證碼驗(yàn)證,這個(gè)方法可以完全解決CSRF。但是出于用戶體驗(yàn)考慮,網(wǎng)站不能給所有的操作都加上驗(yàn)證碼。因此驗(yàn)證碼只能作為一種輔助手段,不能作為主要解決方案。
3)驗(yàn)證HTTP Referer字段,該字段記錄了此次HTTP請(qǐng)求的來源地址,最常見的應(yīng)用是圖片防盜鏈。
4)為每個(gè)表單添加令牌token并驗(yàn)證。
04
SQL注入漏洞
1.簡(jiǎn)介
SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,主要是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請(qǐng)求的查詢字符串,實(shí)現(xiàn)無帳號(hào)登錄,甚至篡改數(shù)據(jù)庫。
2.SQL注入的危害
- 數(shù)據(jù)庫信息泄漏:數(shù)據(jù)庫中存放的用戶的隱私信息的泄露
- 網(wǎng)頁篡改:通過操作數(shù)據(jù)庫對(duì)特定網(wǎng)頁進(jìn)行篡改
- 數(shù)據(jù)庫被惡意操作:數(shù)據(jù)庫服務(wù)器被攻擊,數(shù)據(jù)庫的系統(tǒng)管理員帳戶被竄改
- 服務(wù)器被遠(yuǎn)程控制,被安裝后門
- 刪除和修改數(shù)據(jù)庫表信息
3.SQL注入的方式
通常情況下,SQL注入的位置包括:
(1)表單提交,主要是POST請(qǐng)求,也包括GET請(qǐng)求;
(2)URL參數(shù)提交,主要為GET請(qǐng)求參數(shù);
(3)Cookie參數(shù)提交;
(4)HTTP請(qǐng)求頭部的一些可修改的值,比如Referer、User_Agent等;
4.簡(jiǎn)單舉例
舉一個(gè)簡(jiǎn)單的例子,select * from user where id=100 ,表示查詢id為100的用戶信息,如果id=100變?yōu)?id=100 or 2=2,sql將變?yōu)椋簊elect * from user where id=100 or 2=2,將把所有user表的信息查詢出來,這就是典型的sql注入。
5.防止SQL注入的解決方案
1)對(duì)用戶的輸入進(jìn)行校驗(yàn),使用正則表達(dá)式過濾傳入的參數(shù)
2)使用參數(shù)化語句,不要拼接sql,也可以使用安全的存儲(chǔ)過程
3)不要使用管理員權(quán)限的數(shù)據(jù)庫連接,為每個(gè)應(yīng)用使用權(quán)限有限的數(shù)據(jù)庫連接
4)檢查數(shù)據(jù)存儲(chǔ)類型
5)重要的信息一定要加密
總之就是既要做好過濾與編碼并使用參數(shù)化語句,也要把重要的信息進(jìn)行加密處理,這樣SQL注入漏洞才能更好的解決。