1. 程式人生 > >常見網路安全問題及處理(xss和csrf)

常見網路安全問題及處理(xss和csrf)

強調內容## 1、XSS(Cross Site Script)

把token儲存在cookie中,同時設定httpOnly。

2、CSRF(cross-site request forgery)

2.1、判斷reffer。系統改動最小,通過filter就可以完成。

2.2、在引數中傳token。

2.3、通過header傳遞token。(推薦)

關於xss和csrf帶來的網路安全問題,網上各種版本,讀起來很是費解,在網上找了比較好理解的好幾個版本

版本一:

csrf是讓使用者在不知情的情況,冒用其身份發起了一個請求;可以乾的事情比較侷限;

XSS是一些不三不四的網站借用使用者的身份幹了很多莫名其妙的事情,投票啊,評論啊,發帖啊之類的;

版本二:

xss:使用者過分信任網站,放任來自瀏覽器位址列代表的那個網站程式碼在自己本地任意執行。如果沒有瀏覽器的安全機制限制,xss程式碼可以在使用者瀏覽器為所欲為;

csrf:網站過分信任使用者,放任來自所謂通過訪問控制機制的代表合法使用者的請求執行網站的某個特定功能。

版本三

xss:攻擊者盜用使用者身份來做事。[盜用身份之後可以做很多事]

csrf:攻擊者利用使用者的手來做事。[借用戶的手來做事,做的事有侷限性]

版本四

XSS:跨站指令碼攻擊,注重的是指令碼,一般來說,吃什麼吐什麼

CSRF:跨站請求偽造,注重的是跨站,偽造,也就是說重點在借刀殺人

版本五

XSS: 通過客戶端指令碼語言(最常見如:JavaScript)
在一個論壇發帖中釋出一段惡意的JavaScript程式碼就是指令碼注入,如果這個程式碼內容有請求外部伺服器,那麼就叫做XSS!

CSRF:又稱XSRF,冒充使用者發起請求(在使用者不知情的情況下),完成一些違背使用者意願的請求(如惡意發帖,刪帖,改密碼,發郵件等)。

。。。。。。。。。。。。。。。。。。版本很多,寫不完

先來解釋一下兩者

XSS:

跨站指令碼(Cross-site scripting,通常簡稱為XSS)是一種網站應用程式的安全漏洞攻擊,是程式碼注入的一種。它允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及使用者端指令碼語言。

CSRF:

跨站請求偽造(英語:Cross-site request forgery),也被稱為 one-click attack 或者 session riding,通常縮寫為 CSRF 或者 XSRF, 是一種挾制使用者在當前已登入的Web應用程式上執行非本意的操作的攻擊方法。

簡單來說:

XSS: 通過客戶端指令碼語言(最常見如:JavaScript)
在一個論壇發帖中釋出一段惡意的JavaScript程式碼就是指令碼注入,如果這個程式碼內容有請求外部伺服器,那麼就叫做XSS!

CSRF:又稱XSRF,冒充使用者發起請求(在使用者不知情的情況下),完成一些違背使用者意願的請求(如惡意發帖,刪帖,改密碼,發郵件等)。

**通常來說CSRF是由XSS實現的,所以CSRF時常也被稱為XSRF[用XSS的方式實現偽造請求](但實現的方式絕不止一種,還可以直接通過命令列模式(命令列敲命令來發起請求)直接偽造請求[只要通過合法驗證即可])。
XSS更偏向於程式碼實現(即寫一段擁有跨站請求功能的JavaScript指令碼注入到一條帖子裡,然後有使用者訪問了這個帖子,這就算是中了XSS攻擊了),CSRF更偏向於一個攻擊結果,只要發起了冒牌請求那麼就算是CSRF了。**

簡單來說,條條大路(XSS路,命令列路)通羅馬(CSRF馬,XSRF馬)。

如何防禦CSRF和XSS

直接上方法,沒有來得及寫呆萌

XSS防禦

1.在輸出html時,加上Content Security Policy的Http Header

(作用:可以防止頁面被XSS攻擊時,嵌入第三方的指令碼檔案等)

(缺陷:IE或低版本的瀏覽器可能不支援)

2.在設定Cookie時,加上HttpOnly引數

(作用:可以防止頁面被XSS攻擊時,Cookie資訊被盜取,可相容至IE6)

(缺陷:網站本身的JS程式碼也無法操作Cookie,而且作用有限,只能保證Cookie的安全)

CSRF 防禦

1.驗證碼(可以偽造)

2.所有需要使用者登入之後才能執行的操作屬於重要操作,這些操作傳遞引數應該使用post方式,更加安全;

3.在開發API時,檢驗請求的Referer引數

(作用:可以在一定程度上防止CSRF攻擊)

(缺陷:IE或低版本的瀏覽器中,Referer引數可以被偽造)

4.Token
使用Anti-CSRF Token 在URL中保持原引數不變,新增一個引數Token。Token的值是隨機的(必須使用足夠安全的隨機數生成演算法,或者採用真隨機數生成器),其為使用者與伺服器所共同持有,可以放在使用者的Session中,或者瀏覽器的Cookie中。 注意保密,儘量把Token放在表單中(構造一個隱藏的input元素),以POST提交,避免Token洩露。

token的實現:
可以看看我之前寫的一篇關於Java實現token的文章

 注意:如果網站有XSS漏洞或者一些跨域漏洞,可能導致Token洩露。 
在XSS攻擊下,讀取Token值,然後再構造出一個合法的請,可以稱為:XSRF。