前端安全(XSS、CSRF防御)


一、網絡安全
 
       OWASP:開放式Web應用程序安全項目(OWASP,Open Web Application Security Project)
       OWASP是一個開源的、非盈利的全球性安全組織,致力於應用軟件的安全研究。 http://www.owasp.org.cn/
 
       

 

 
二、XSS攻擊
     
      1、總述
 
      

 

 
      2、XSS攻擊原理
           XSS攻擊(Cross-Site Scripting)跨站腳本攻擊。 被OWASP評為十大安全漏洞中的第二威脅漏洞。
        
           

 

          
           特點:能注入惡意的HTML/JavaScript代碼到用戶瀏覽的網頁上,從而達到Cookie資料竊取、會話劫持、釣魚欺騙等攻擊。<攻擊代碼不一定(非要)在 <script></script> 中>
 
           原因:a:Web瀏覽器本身的設計不安全。瀏覽器能解析和執行JS等代碼,但是不會判斷該數據和程序代碼是否惡意。
                     b:輸入和輸出是Web應用程序最基本的交互,而且網站的交互功能越來越豐富。如果在這過程中沒有做好安全防護,很容易會出現XSS漏洞。
                     c:程序員水平參差不齊,而且大都沒有過正規的安全培訓,沒有相關的安全意識。
                     d:XSS攻擊手段靈活多變。
 
      3、防御XSS攻擊
           
           a:HttpOnly    瀏覽器禁止頁面的JS訪問帶有HttpOnly屬性的Cookie。
 
           b:輸入檢查 XSS Filter     對輸入內容做格式檢查,類似“白名單”,可以讓一些基於特殊字符的攻擊失效。在客戶端JS和服務器端代碼中實現相同的輸入檢查(服務器端必須有)。
 
           c:輸出檢查     在變量輸出到html頁面時,可以使用編碼或轉義的方式來防御XSS攻擊  HtmlEncode:將字符轉成HTMLEntities,對應的標准是ISO-8859-1。
                                  &  --> &amp;   < --> &lt;    > -->&gt;    " --> &quot;    ' --> &#x27;     / --> &#x2F;
                                  JS中可以使用JavascriptEncode。需要對“\”對特殊字符轉義,輸出的變量的必須在引號內部。
 
           d:XSS的本質是“HTML注入”,用戶的數據被當成了HTML代碼一部分來執行,從而混淆了原本的語義,產生了新的語義。
               
                在Html標簽中輸出:<div>$var</div>  在標簽中輸出的變量,如果未做任何處理,都能導致直接產生XSS:構造一個<script>標簽,或者是任何能夠產生腳本執行的方式:<div><script>alert(/XSS/)</script></div>  或者  <a href=# ><img src=# onerror=alert(1) /></a>
                防御方法:對變量使用HtmlEncode。
          
                在Html屬性中輸出:<div id="abc name="$var"></div> 攻擊方法:<div id="abc" name=""><script>alert(/XSS/)</script><""></div>
                防御方法:采用HtmlEncode。  在OWASP ESAPI中推薦了一種更嚴格的HtmlEncode:除了字母、數字外,所有的特殊字符都被編碼成HTMLEntities。
 
                在<script>標簽中輸出:<script>var x = "";alert(/XSS/);//";<script>
                防御方法:使用JavascriptEncode。
 
                在事件中輸出:與在<script>標簽中輸出類似:<a href=# onclick="funcA('');alert(/XSS/);//')">test</a>
                防御方法:使用JavascriptEncode。
 
                在CSS中輸出:方式多樣
                防御方法:盡可能禁止用戶可控制的變量在"<style>標簽"、"html標簽的style屬性"、"CSS文件"中輸出。如果一定有此需求,則推薦使用 OWASP ESAPI 中的encodeForCSS()函數。除了字母、數字外的所有字符都被編碼成十六進制形式“\uHH”。
 
                在地址中輸出:比較復雜。一般是在URL的path(路徑)或者search(參數)中輸出,使用URLEncode即可。
                <a href="http://www.evil.com/?test=$var">test</a>   -->  <a href="http://www.evil.com/?test=" onclick=alert(1)"" >test</a>
                整個URL都被用戶完全控制時,URL的Protocal(http://) 和Host (www.evil.com)部分不能使用URLEncode,可能會構造偽協議實施攻擊:
                <a href="$var"></a>   -->   <a href="javascript:alert(1);"></a>
                防御方法:先檢查變量是否以”http“開頭(如果不是則自動添加),以保證不會出現偽協議類的XSS攻擊。在此之后,再對變量進行URLEncode。
 
           e:處理富文本   網站允許用戶提交一些自定義的HTML代碼,稱之為”富文本“。比如用戶在論壇里發帖,帖子的內容有圖片、視頻、表格等,這些”富文本“的效果都需要通過HTML代碼來實現。
                防御方法:與輸入檢查的思路一致。使用"XSS Filter":“事件”應該被嚴格禁止;一些危險的標簽:<iframe>、<script>、<base>、<form>等也應嚴格禁止;在標簽、屬性、事件的選擇上,應該使用白名單,避免使用黑名單。比如,只允許<a>、<img>、<div>等比較“安全”的標簽存在。可使用一些開源項目:Anti-Samy 是OWASP上的一個開源項目,可使用於Java、.NET等。  HTMLPurify可使用於PHP中。
 
           f:防御DOM Based XSS    如果是輸出到事件或腳本,要做一次javascriptEncode;如果是輸出到HTML內容或者屬性,要做一次HtmlEncode。
 
                處理XSS注入的時候,不僅僅要轉義或刪除特殊的 HTML 標記和符號,如尖括號<>,如script,如iframe等,還需要過濾 JavaScript 事件所涉及的大量屬性,前端一般使用XSS Filter 設置“白名單”。過濾的事件大致如下:
 
屬性 當以下情況發生時,出現此事件
onabort 圖像加載被中斷
onblur 元素失去焦點
onchange 用戶改變域的內容
onclick 鼠標點擊某個對象
ondblclick 鼠標雙擊某個對象
onerror 當加載文檔或圖像時發生某個錯誤
onfocus 元素獲得焦點
onkeydown 某個鍵盤的鍵被按下
onkeypress 某個鍵盤的鍵被按下或按住
onkeyup 某個鍵盤的鍵被松開
onload 某個頁面或圖像被完成加載
onmousedown 某個鼠標按鍵被按下
onmousemove 鼠標被移動
onmouseout 鼠標從某元素移開
onmouseover 鼠標被移到某元素之上
onmouseup 某個鼠標按鍵被松開
onreset 重置按鈕被點擊
onresize 窗口或框架被調整尺寸
onselect 文本被選定
onsubmit 提交按鈕被點擊
onunload 用戶退出頁面
 
 
三、CSRF攻擊
 
      1、總述
     
           

 

 
     2、攻擊原理
 
           

 

            CSRF攻擊跨站請求偽造。 本質:重要操作的所有參數都是可以被攻擊者猜測到的。攻擊者預測出URL的所有參數與參數值,才能成功地構造一個偽造的請求。        
 
      3、防御CSRF攻擊
 
           防御方法:  驗證碼、  Referer Check 檢查請求是否來自合法的源(可被偽造)。
 
           通用方法:Token   使用Anti-CSRF Token   在URL中保持原參數不變,新增一個參數Token。Token的值是隨機的(必須使用足夠安全的隨機數生成算法,或者采用真隨機數生成器),其為用戶與服務器所共同持有,可以放在用戶的Session中,或者瀏覽器的Cookie中。 注意保密,盡量把Token放在表單中(構造一個隱藏的input元素),以POST提交,避免Token泄露。
 
           注意:如果網站有XSS漏洞或者一些跨域漏洞,可能導致Token泄露。 
                      在XSS攻擊下,讀取Token值,然后再構造出一個合法的請求,可以稱為:XSRF。
     
 
四、HTML5安全  
 
        HTML5新增的一些標簽和屬性,使XSS攻擊產生了新的變化,如果原來的XSS Filter是用的“黑名單”,就會導致攻擊者用HTML5新增的標簽來進行攻擊,如果用的“白名單”,這方面的隱患就會少一些。
 
 
五、常見前端框架對XSS攻擊的防范    
 
     React 默認會轉義所有字符串。
 
      AngularJS    使用AngularJS中的SCE來防御XSS攻擊。
 
 
六、Web安全掃描器 
 
       商業軟件:IBM Rational Appscan、WebInspect、Acunetix WVS
 
       免費軟件:W3AF、SkipFish
 
--------------------------------------------------------------------------------------------
 
參考資料:《白帽子講Web安全》 吳瀚清
                  《Web前端黑客技術揭秘》 鍾晨鳴  徐少培
                  《XSS跨站腳本攻擊剖析與防御》 邱永華
                  《OWASP Top 10-2013》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM