摘要:毫無疑問,Node.js已經變的愈加成熟,盡管這樣,開發者仍然缺乏大量的安全指南。本文將分享一些有關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] view plaincopy在CODE上查看代碼片派生到我的代碼片
'use strict';
delete Object.prototype; // TypeError
4.對象聲明必須是獨一無二的
[js] view plaincopy在CODE上查看代碼片派生到我的代碼片
'use strict';
var obj = {
a: 1,
a: 2
};
// syntax error
5.Prohibits with
[js] view plaincopy在CODE上查看代碼片派生到我的代碼片
var obj = { x: 17 };
with (obj) // !!! syntax error
{
}
你可以訪問 MDN來獲得這些隱性錯誤的完整列表。
6.測試
不用說,測試,測試,多點測試~
當然,不僅僅是單元測試,直戳測試金字塔。
7.對sudo node app.js說再見
我看到很多人在運行擁有超級用戶權限的Node APP,為什么?因為他們想讓應用程序能夠監聽80或443端口。
這種做法是錯誤的。小心一個錯誤/bug進程就能降低整個系統,因為它已經擁有合法的憑證去做任何事情。
取而代之,你應該設置一個HTTP服務器/代理來轉換請求,可以是nginx、Apache等等。
8.避免命令注入
看看下面這段代碼有什么問題?
[js] view plaincopy在CODE上查看代碼片派生到我的代碼片
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、執行剪貼板和修改頁面本身。
具體示例:
[js] view plaincopy在CODE上查看代碼片派生到我的代碼片
<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] view plaincopy在CODE上查看代碼片派生到我的代碼片
var cookies = document.cookie.split('; ');
如何預防:
開發者可以在cookies里面設置httponly標記,這樣,JavaScript便無法接近cookie了。
13.內容安全策略(CSP)
CSP(Content Security Policy)是一個額外添加的安全層,它有助于檢測和減輕某些類型的攻擊,包括跨站腳本(XSS)和數據注入攻擊。
通過HTTP header中的Content-Security-Policy方法來啟動CSP。
示例
[js] view plaincopy在CODE上查看代碼片派生到我的代碼片
Content-Security-Policy: default-src 'self' *.mydomain.com
這樣便會允許內容來自可信域或其子域。
點擊查看更多有關 CSP示例。
14.跨站請求偽造(CSRF)
CSRF(Cross-Site Request Forgery)是一種挾制終端用戶在當前已登錄的Web應用程序上執行非本意的操作的攻擊方法。
示例:
[js] view plaincopy在CODE上查看代碼片派生到我的代碼片
<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中的每一個模塊,發現問題并修復問題。
英文來自: CODESHIP
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。