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屬性
- 'use strict';
- delete Object.prototype; // TypeError
4.對象聲明必須是獨一無二的
- 'use strict';
- var obj = {
- a: 1,
- a: 2
- };
- // syntax error
5.Prohibits with
- var obj = { x: 17 };
- with (obj) // !!! syntax error
- {
-
- }
獲得這些隱性錯誤的完整列表,你可以訪問
MDN
。
6.測試
不用說,測試,測試,多點測試~
當然,不僅僅是單元測試,直戳
測試金字塔
。
7.對sudo node app.js說再見
我看到很多人在運行擁有超級用戶權限的Node APP,爲什麼?因爲他們想讓應用程序能夠監聽80或443端口。
這種做法是錯誤的。小心一個錯誤/bug進程就能降低整個系統,因爲它已經擁有合法的憑證去做任何事情。
取而代之,你應該設置一個HTTP服務器/代理來轉換請求,可以是nginx、Apache等等。
8.避免命令注入
看看下面這段代碼有什麼問題?
- child_process.exec('ls', function (err, data) {
- console.log(data);
- });
child_process.exec調用去執行/bin/sh,所以,這是一個bash注射器,而不是一個程序啓動器。
當用戶輸入的內容傳遞到這個方法中,就會產生問題——要麼是一個\要麼就是$(),攻擊者很可能會注入一個新的命令。
開發人員可以使用child_process.execFile來解決此類問題。訪問 LiftSecurity來查看如何處理命令注入。
9.臨時文件
開發人員在創建文件時要特別注意,例如處理上傳文件。這些文件很容易吃掉你所有的磁盤空間。
解決方法是使用Streams。
10.確保Web應用程序安全
這裏不僅僅是針對Node——而是關於如何確保你的Web應用程序安全。
11.跨站腳本反射
當攻擊者把代碼注入到HTTP響應時,這種情況纔會發生。應用程序在返回無效的輸入到客戶端時(大多數都是基於JavaScript編寫的),應用程序很容易遭受這種類型攻擊。攻擊者可以盜取cookies、執行剪貼板和修改頁面本身。
具體示例:
- <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庫都可以讀取它們。
示例:
- var cookies = document.cookie.split('; ');
如何預防:
開發者可以在cookies裏面設置httponly標記,這樣,JavaScript便無法接近cookie了。
13.內容安全策略(CSP)
CSP(Content Security Policy)是一個額外添加的安全層,它有助於檢測和減輕某些類型的攻擊,包括跨站腳本(XSS)和數據注入攻擊。
通過HTTP header中的Content-Security-Policy方法來啓動CSP。
示例
- Content-Security-Policy: default-src 'self' *.mydomain.com
這樣便會允許內容來自可信域或子域。
點擊查看更多有關
CSP示例
。
14.跨站請求僞造(CSRF)
CSRF(Cross-Site Request Forgery)是一種挾制終端用戶在當前已登錄的Web應用程序上執行非本意的操作的攻擊方法。
示例:
- <body onload="document.forms[0].submit()">
- <form method="POST" action="http://yoursite.com/user/delete">
- <input type="hidden" name="id" value="123555.">
- </form>
- </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中的每一個模塊,發現問題並修復問題。