JavaScript安全性問題與最佳預防作法

英文 |  https://blog.bitsrc.io/javascript-security-issues-and-best-practices-37e78df4dce4
翻譯 | web前端開發(ID:web_qdkf)

衆所周知,JavaScript是一種很是完善的編程語言。JavaScript一般能夠在動態網頁中找到,以提供擴展功能,例如表單提交/驗證,交互性,動畫,用戶活動跟蹤等。可是一些用戶對JavaScript的安全性方面很是懷疑。
JavaScript漏洞既多是客戶端問題,也多是服務器端問題。黑客經過應用程序中的各類路徑可能潛在地損害你的業務。這些威脅須要以一種或另外一種方式進行評估和處理。
咱們將討論這些常見威脅中的兩個以及如何使應用程序免受威脅。

跨站點腳本(XSS)攻擊

跨站點腳本是最多見的瀏覽器端漏洞之一。XSS自己是由客戶端腳本語言(例如HTML和JavaScript)的Internet安全漏洞引發的威脅。在XSS中,攻擊者可以操縱合法但易受攻擊的Web應用程序執行惡意任務。
XSS攻擊可能致使身份和數據盜竊。它們甚至可能致使病毒傳播,有時甚至致使對用戶瀏覽器的遠程控制。

例如:

讓咱們看一個簡單的XSS攻擊示例。
  
    
  
  
   
   
            
   
   

  
    
  
  
   
   
            
   
   
//HTML<form><input id="query-input" type='TEXT' name="query"><button type="submit">Click me</button></form><div id="query-output"></div>//JavaScriptif (document.readyState == 'loading') { document.addEventListener('DOMContentLoaded', ready)} else { ready()}function ready() { var query = new URL(window.location).searchParams.get('query') document.getElementById('query-input').value = query document.getElementById('query-output').innerHTML = query}
你可使用Codepen在調試模式下嘗試上述代碼。當你插入img帶有空src標籤的標籤時,它將觸發該onerror方法。所以,若是你在其中插入腳本,它將運行。
例如,若是你輸入如下內容做爲文本框的輸入,那麼你將可以看到正在控制檯中打印的cookie。
  
    
  
  
   
   
            
   
   

  
    
  
  
   
   
            
   
   
<img src onerror =「 console.log(document.cookie)」>
如今簡單地,若是將上面的代碼query做爲參數複製粘貼到URL中,則能夠實現上面的輸出。
  
    
  
  
   
   
            
   
   

  
    
  
  
   
   
            
   
   
http:// localhost / page?query = <img src onerror = console.logdocument.cookie)」>
所以,若是你的網站不安全,則黑客能夠輕鬆地將一些JS代碼注入你的參數中並獲取用戶有權訪問的任何數據。此代碼將容許將受害者的會話ID轉移到黑客的站點,所以當黑客得到對它的訪問權時,它可能會被濫用。

預防

  • 到達時過濾輸入-每當你從用戶那裏獲得輸入時,都應根據預期或有效輸入儘量嚴格地過濾輸入。
  • 使用適當的響應標頭-爲了防止HTTP響應中不包含任何HTML或JavaScript的XSS,可使用Content-Type和X-Content-Type-Options標頭來確保瀏覽器按照您指望的方式解釋響應。
  • 輸出時對數據進行編碼-當在HTTP響應中輸出用戶輸入的數據時,請對輸出進行編碼,以防止將其識別爲活動內容。
  • 內容安全策略(CSP)-若是實施正確的CSP規則集,則能夠阻止瀏覽器執行嵌入式 JavaScript,eval(),setTimeout()或來自不受信任URL的任何JavaScript之類的操做。

跨站請求僞造(CSRF)攻擊

CSRF或XSRF是一種攻擊,黑客經過劫持會話cookie來接管或冒充受害者的身份。當目標站點僅使用cookie對請求進行身份驗證,從而容許黑客竊取或劫持cookie並假冒合法用戶時,這是可能的。這種攻擊可能致使賬戶篡改,數據盜竊,欺詐等。目標包括社交媒體,瀏覽器內電子郵件客戶端,在線銀行和網絡設備的Web界面以及Web應用程序。

例如:

讓咱們看一個簡單的例子。
假設咱們有一家銀行。在咱們的網站上,典型的銀行轉賬請求就是這樣的GET請求。
  
    
  
  
   
   
            
   
   

  
    
  
  
   
   
            
   
   
GET http://www.bank.com/transfer.php?acct=PersonB&amount=100¤cy=USD
咱們的銀行使用會話Cookie對請求進行身份驗證。所以,爲了使用戶轉移資金,事件流將是:
  • 登陸銀行帳戶
  • 輸入詳細信息,而後單擊轉移
當用戶登陸到銀行賬戶時,該網站會存儲一個會話cookie,該會話cookie之後將用於受權每筆交易。
行動中
當黑客進入現場時,黑客會建立一個看起來很是有用但有隱藏議程的網站。假設它是一個博客網站。當用戶添加新博客帖子時,惡意應用程序將執行隱藏代碼,該代碼會將GET請求發送到銀行網站。爲了使這種黑客成功,用戶應該登陸到他的銀行賬戶-會話令牌應該就位。
這是黑客操縱GET請求的方式。
  
    
  
  
   
   
            
   
   

  
    
  
  
   
   
            
   
   
GET http://www.bank.com/transfer.php?acct=Hacker&amount=100¤cy=USD
當用戶單擊「添加博客文章」時,此隱藏請求將被執行,而且在用戶不知情的狀況下,這筆錢將被轉移到黑客的銀行賬戶中。
以上技術也能夠用於POST請求。黑客要作的就是建立一個<form>帶有隱藏輸入的,並向銀行URL發送POST。
  
    
  
  
   
   
            
   
   

  
    
  
  
   
   
            
   
   
<body onload="document.forms[0].submit()"> <form action="http://www.bank.com/transfer.php" method="POST"> <input type="hidden" name="acct" value="Hacker"/> <input type="hidden" name="amount" value="100"/> <input type="hidden" name="currency" value="USD"/> <input type="submit" value="View my pictures!"/> </form></body>

預防

  • 始終對會話cookie使用SameSite Cookie屬性
  • 引薦來源標頭或來源必須通過驗證
  • 考慮爲高度敏感的操做實施基於用戶交互的保護-基於用戶交互的保護包括從新認證(密碼或更強),一次性令牌,CAPTCHA。若是正確實施,這些能夠充當強大的CSRF防護。
JavaScript中的安全性是一個很是廣闊的主題,你不可能一晚上之間學習和掌握。我強烈建議你諮詢網絡安全專家,以更好地瞭解網站的安全級別。
參考
OWASP CheatSheet
OWASP Web Goat
博客,做者Rachit Agarwal

本文分享自微信公衆號 - web前端開發(web_qdkf)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。javascript

相關文章
相關標籤/搜索