node.js開發的幾點安全技巧

【編者按】互聯網安全事件層出不羣,用戶每時每刻都有可能會遭受攻擊者襲擊。作爲軟件開發人員,則是最大限度的保證應用程序安全。本文主要是對Node.js語言作出的安全開發建議。 

以下爲譯文:  

毫無疑問,Node.js已經變的愈加成熟,儘管這樣,開發者仍然缺乏大量的安全指南。在這篇文章中,我將分享一些有關Node.js安全要點給大家,希望大家能夠謹記於心。 

1.避免使用Eval  

Eval並不是唯一一個需要避免的函數,在後臺,下面這幾個表達式可以使用eval: 

  • setInterval(String, 2)
  • setTimeout(String, 2)
  • new Function(String)

爲什麼要禁止使用eval?因爲它會打開代碼引起注入攻擊,並且降低運行速度。 

2.請用嚴苛模式(Strict mode)  

這種情況下,你可以使用一個受限制的JavaScript變量,它可以消除一些隱性錯誤並且會把這些錯誤拋出去。 

3.Undeletable屬性 

Js代碼 
  1. 'use strict';      
  2. delete Object.prototype; // TypeError     


4.對象聲明必須是獨一無二的  

Js代碼 
  1. 'use strict';      
  2. var obj = {      
  3.     a: 1,     
  4.     a: 2     
  5. };     
  6. // syntax error    


5.Prohibits with  

Js代碼 
  1. var obj = { x: 17 };      
  2. with (obj) // !!! syntax error      
  3. {    
  4.     
  5. }    


獲得這些隱性錯誤的完整列表,你可以訪問  MDN 。 

6.測試  

不用說,測試,測試,多點測試~ 

 

當然,不僅僅是單元測試,直戳  測試金字塔 。 

7.對sudo node app.js說再見  

我看到很多人在運行擁有超級用戶權限的Node APP,爲什麼?因爲他們想讓應用程序能夠監聽80或443端口。 

這種做法是錯誤的。小心一個錯誤/bug進程就能降低整個系統,因爲它已經擁有合法的憑證去做任何事情。 

取而代之,你應該設置一個HTTP服務器/代理來轉換請求,可以是nginx、Apache等等。 

8.避免命令注入  

看看下面這段代碼有什麼問題? 
Js代碼 
  1. child_process.exec('ls'function (err, data) {      
  2.     console.log(data);    
  3. });    

child_process.exec調用去執行/bin/sh,所以,這是一個bash注射器,而不是一個程序啓動器。 

當用戶輸入的內容傳遞到這個方法中,就會產生問題——要麼是一個\要麼就是$(),攻擊者很可能會注入一個新的命令。 

開發人員可以使用child_process.execFile來解決此類問題。訪問 LiftSecurity來查看如何處理命令注入。 

9.臨時文件  

開發人員在創建文件時要特別注意,例如處理上傳文件。這些文件很容易吃掉你所有的磁盤空間。 

解決方法是使用Streams。 

10.確保Web應用程序安全  

這裏不僅僅是針對Node——而是關於如何確保你的Web應用程序安全。 

11.跨站腳本反射  

當攻擊者把代碼注入到HTTP響應時,這種情況纔會發生。應用程序在返回無效的輸入到客戶端時(大多數都是基於JavaScript編寫的),應用程序很容易遭受這種類型攻擊。攻擊者可以盜取cookies、執行剪貼板和修改頁面本身。 

具體示例: 
Js代碼 
  1. <a href="http://example.com/index.php?user=<script">http://example.com/index.php?user=<script</a>>alert(123)</script>   


如果用戶查詢字符串在沒有驗證的情況下被髮送回客戶端,並且插入到DOM中,它便會執行。 
如何預防: 

  • 禁止插入不可信的數據到DOM中;
  • 在插入前進行HTML escape。

點擊鏈接可以查看更多關於  跨站腳本反射 和  解決之道 。 

12.停止Cookie盜 竊  

默認情況下,在同一個域裏,JavaScript可以讀取cookies,在跨站腳本攻擊裏,這是非常危險的。不僅如此,任何第三方JavaScript庫都可以讀取它們。 
示例: 
Js代碼 
  1. var cookies = document.cookie.split('; ');   

如何預防: 

開發者可以在cookies裏面設置httponly標記,這樣,JavaScript便無法接近cookie了。 

13.內容安全策略(CSP)  

CSP(Content Security Policy)是一個額外添加的安全層,它有助於檢測和減輕某些類型的攻擊,包括跨站腳本(XSS)和數據注入攻擊。 
通過HTTP header中的Content-Security-Policy方法來啓動CSP。 

示例 
Js代碼 
  1. Content-Security-Policy: default-src 'self' *.mydomain.com    

這樣便會允許內容來自可信域或子域。 
點擊查看更多有關  CSP示例 。 

14.跨站請求僞造(CSRF) 

CSRF(Cross-Site Request Forgery)是一種挾制終端用戶在當前已登錄的Web應用程序上執行非本意的操作的攻擊方法。 

示例: 
Js代碼 
  1. <body onload="document.forms[0].submit()">      
  2.   <form method="POST" action="http://yoursite.com/user/delete">    
  3.     <input type="hidden" name="id" value="123555.">    
  4.   </form>    
  5. </body>      

執行上面這段代碼的後果就是輕易刪除用戶配置文件。 
如何預防: 

要想阻止CSRF,你應該實現同步令牌模式(Synchronizer Token Pattern),幸運的是,Node社區已經幫你完成了這件事。長話短說,一起來看看它的工作原理: 

  • 當一個GET請求被服務檢查爲CSRF令牌——如果不存在,就創建一個;
  • 當用戶輸入顯示時,確保要添加一個隱形的CSRF令牌值;
  • 當發送表單時,確保值是來自表單並且要與session相匹配。

行動 

開發者應該有所行動,製作一個  Security Adventure 車間來指導現實應用開發。 

15.保護Express應用程序:Helmet  

Helmet是一系列幫助增強Node之Express/Connect等Javascript Web應用安全的中間件。安全功能包括: 

  • csp
  • crossdomain
  • xframe
  • xssfilter
  • 等等

有關Helmet更多內容,可以訪問其託管地址: https://github.com/evilpacket/helmet 。  

16.使用工具  

npm shrinkwrap:該命令可以給一個包的所有依賴關係上鎖,並且創建一個npm-shrinkwrap.json文件。更多詳情可以訪問  NPM 。 
retire.js:retire.js是一個命令行掃描器,幫助你找到你應用中依賴庫存在的漏洞。 
如果你想了解更多關於Node安全方面的內容,你可以關注  Node Security  項目。他們的目標是審覈NPM中的每一個模塊,發現問題並修復問題。