轉載:http://www.imooc.com/article/13553
XSS攻擊是什么XSS是跨站腳本攻擊的縮寫,是一種網站應用程序的安全漏洞攻擊,是代碼注入的一種。
通常是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載并執行攻擊者惡意制造的網頁程序。
這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。
攻擊成功后,攻擊者可能得到更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。
XSS攻擊基本原理——代碼注入在web的世界里有各種各樣的語言,于是乎對于語句的解析大家各不相同,有一些語句在一種語言里是合法的,但是在另外一種語言里是非法的。這種二義性使得黑客可以用代碼注入的方式進行攻擊——將惡意代碼注入合法代碼里隱藏起來,再誘發惡意代碼,從而進行各種各樣的非法活動。只要破壞跨層協議的數據/指令的構造,我們就能攻擊。歷史悠久的SQL注入
和XSS注入
都是這種攻擊方式的典范。現如今,隨著參數化查詢的普及,我們已經離SQL注入
很遠了。但是,歷史同樣悠久的XSS
卻沒有遠離我們。XSS
的基本實現思路很簡單——比如持久型XSS
通過一些正常的站內交互途徑,例如發布評論,提交含有JavaScript
的內容文本。這時服務器端如果沒有過濾或轉義掉這些腳本,作為內容發布到了頁面上,其他用戶訪問這個頁面的時候就會運行這些腳本,從而被攻擊。
攻擊分類舉例反射型XSS
反射性XSS,也就是被動的非持久性XSS。誘騙用戶點擊URL帶攻擊代碼的鏈接,服務器解析后響應,在返回的響應內容中隱藏和嵌入攻擊者的XSS代碼,被瀏覽器執行,從而攻擊用戶。URL可能被用戶懷疑,但是可以通過短網址服務將之縮短,從而隱藏自己。
持久型XSS
也叫存儲型XSS——主動提交惡意數據到服務器,攻擊者在數據中嵌入代碼,這樣當其他用戶請求后,服務器從數據庫中查詢數據并發給用戶,用戶瀏覽此類頁面時就可能受到攻擊。可以描述為:惡意用戶的HTML或JS輸入服務器->進入數據庫->服務器響應時查詢數據庫->用戶瀏覽器。
DOM-based XSS
基于DOM的XSS,通過對具體DOM代碼進行分析,根據實際情況構造dom節點進行XSS跨站腳本攻擊。
注:domxss取決于輸出位置,并不取決于輸出環境,因此domxss既有可能是反射型的,也有可能是存儲型的。dom-based與非dom-based,反射和存儲是兩個不同的分類標準。
防范記住一句至理名言——“所有用戶輸入都是不可信的?!保ㄗ⒁? 攻擊代碼不一定在<script></script>中)
使用XSS Filter
輸入過濾,對用戶提交的數據進行有效性驗證,僅接受指定長度范圍內并符合我們期望格式的的內容提交,阻止或者忽略除此外的其他任何數據。
輸出轉義,當需要將一個字符串輸出到Web網頁時,同時又不確定這個字符串中是否包括XSS特殊字符,為了確保輸出內容的完整性和正確性,輸出HTML屬性時可以使用HTML轉義編碼(HTMLEncode)進行處理,輸出到<script>中,可以進行JS編碼。
使用 HttpOnly Cookie
將重要的cookie標記為httponly,這樣的話當瀏覽器向Web服務器發起請求的時就會帶上cookie
字段,但是在js
腳本中卻不能訪問這個cookie,這樣就避免了XSS攻擊利用JavaScript
的document.cookie
獲取cookie
。
困難和幸運
真正麻煩的是,在一些場合我們要允許用戶輸入HTML,又要過濾其中的腳本。這就要求我們對代碼小心地進行轉義。否則,我們可能既獲取不了用戶的正確輸入,又被XSS攻擊。幸好,由于XSS臭名昭著歷史悠久又極其危險,現代web開發框架如vue.js
、react.js
等,在設計的時候就考慮了XSS攻擊對html插值進行了更進一步的抽象、過濾和轉義,我們只要熟練正確地使用他們,就可以在大部分情況下避免XSS攻擊。同時,許多基于MVVM
框架的SPA
(單頁應用)不需要刷新URL來控制view,這樣大大防止了XSS隱患。另外,我們還可以用一些防火墻來阻止XSS的運行。
作者: 沐雨一橙風 鏈接:http://www.imooc.com/article/13553來源:慕課網本文原創發布于慕課網 ,轉載請注明出處,謝謝合作!