bcrypt.hash(PlainPassword, salt, function(err, hash) {

// Store password hash in database

});

});

通過單獨的函數調用,您可以自動生成鹽和哈希,如下所示。 

bcrypt.hash(PlainPassword, saltRounds, function(err, hash) {

// Store password hash in database

});

可以使用下面的代碼塊檢查密碼的正確性。當散列密碼與純密碼匹配時,該函數返回true 。

// Load hash from your password DB.
bcrypt.compare(PlainPassword, hash, function(err, result) {
// result == true
});
Node.js 安全指南 圖片

4. Validator.js

列表中的下一個是 Validator,它是一個輸入驗證模塊。它強制要求用戶輸入符合要求。同樣,它確保輸入的正確性。此列表包括您可以使用 Validator 包配置的所有驗證器。 

5. ESLint 插件

提高 Node.js 應用安全性的另一種方法是集成 ESLint,這是一個 linting 安全插件,可幫助在開發過程中識別易受攻擊的 Node.js 代碼。易受攻擊的代碼實現包括不安全的正則表達式、for循環內的“await”關鍵字等。  

安全最佳實踐

無論您使用 Node.js 構建什么應用程序,都應該在開發的第一階段執行關鍵的安全程序。

因此,為了保證 Node.js 應用程序安全且沒有漏洞,在構建 Node.js 應用程序時實施必要的安全最佳實踐非常重要。我們將在本節中介紹其中的幾個。 

始終審計 Node 模塊

首先,始終審核您在項目中使用的每個節點模塊以進行漏洞檢查是必不可少的。審核有助于確認哪些軟件包可以升級。當您審核軟件包時,您也在確認軟件包的安全性。 

因此,為了審核包/模塊并檢查易受攻擊的依賴項,您可以使用 Snyk、Node Security Project (NSP) 等工具,或運行 npm-audit 來追蹤和修補漏洞。 

始終使用速率限制

其次,暴力破解之類的攻擊是 Node.js 應用常見的安全威脅,而登錄路由是這種攻擊最常針對的目標。速率限制有助于限制暴力破解攻擊的影響。Node.js ratelimiter包有助于將速率限制集成到您的 Node.js 應用中。使用 ratelimiter 模塊,您可以根據用戶的 ID 限制中間件的實現。 

var id = req.user._id;

var limit = new Limiter({ id: id, db: db });

limit.get(function(err, limit){

if (err) return next(err);

res.set('X-RateLimit-Limit', limit.total);

res.set('X-RateLimit-Remaining', limit.remaining - 1);

res.set('X-RateLimit-Reset', limit.reset);



// looks good

debug('remaining %s/%s %s', limit.remaining - 1, limit.total, id);

if (limit.remaining) return next();



// does not look good

var delta = (limit.reset * 1000) - Date.now() | 0;

var after = limit.reset - (Date.now() / 1000) | 0;

res.set('Retry-After', after);

res.send(429, 'Rate limit exceeded, retry in ' + ms(delta, { long: true }));

});

Express Brute軟件包還可以進行速率限制,以減輕暴力破解和拒絕服務 (DoS) 攻擊。 

使用 TLS/SSL 進行數據傳輸

第三,在將數據從一層傳輸到另一層時,數據保密性非常重要,以防止潛在攻擊者的嗅探。通過加密保護數據傳輸的一種常見方法是使用傳輸層安全性 (TLS) 和安全套接字層 (SSL)。需要澄清的是,SSL 對客戶端-服務器連接進行端到端加密,而 TLS 保護密碼數據和信用卡詳細信息等敏感信息。 

轉義輸出

此外,為了避免跨站點腳本 (XSS) 等注入攻擊,輸出轉義起著關鍵作用。本文后面將解釋 XSS。要轉義代碼中的輸出,您可以使用Node ES API 庫或Escape HTML 庫來轉義用戶可以訪問的所有 JavaScript 和 HTML 代碼。 

記錄并監控您的應用程序

最后,服務器上的負載可能會導致 DoS,從而導致應用程序停機。因此,監控服務器的傳入和傳出流量非常重要,當服務器處于極端負載時,您可以隨時收到警報。如果您的服務器不是因為極端負載而崩潰,而是由于安全攻擊,則必須正確使用日志來了解安全攻擊發生的方式和時間。Bunyan Node.js模塊有助于高效記錄您的 Node.js 服務。TooBusy Node.js 模塊是監控 Node.js 應用程序的重要工具 

OWASP Node.js 安全備忘單包含全面的安全最佳實踐列表。了解安全攻擊以及緩解這些攻擊的主要方法是安全的關鍵,這也是下一節的內容。 

最常見的 Node.js 安全攻擊

Node.js 有幾種安全攻擊,但我們將在本部分詳細回顧常見的攻擊。 

SQL 注入

SQL 注入涉及通過用戶輸入的數據向應用程序插入 SQL 查詢。這些攻擊利用應用程序中要求用戶輸入的區域。實施 SQL 注入攻擊的攻擊者在成功攻擊后將能夠訪問應用程序的數據庫。您可以在 StackHawk 上閱讀有關 SQL 注入的更多信息。 

為了防止注入攻擊,輸入驗證是關鍵,上面提到的 Validator 包有助于進行正確的輸入驗證。Validator 模塊具有允許列表和阻止列表驗證方法,這些方法用于明確聲明您希望在輸入驗證過程中授權的內容并阻止其他所有內容。 

跨站點腳本 (XSS)

XSS涉及將客戶端腳本注入網站。利用 XSS,攻擊者能夠操縱 Web 應用程序,目的是向 Web 應用程序的用戶發送惡意代碼。XSS 攻擊的目的是竊取用戶的數據或控制 Web 應用程序。 

為了防止 XSS 攻擊,你需要根據項目需求使用安全的 HTTP 標頭。上面提到的 Helmet 提供了設置安全 HTTP 標頭的中間件函數。 

命令注入

命令注入是指注入輸入,改變易受攻擊的應用程序中的有效合法命令,以便執行針對操作系統的非法命令。這種攻擊主要針對系統 shell。輸入注入??可以來自用戶可以修改的任何來源,例如表單。這種攻擊以系統 shell 為目標。 

再次強調,為了防止注入攻擊,輸入驗證是關鍵。 

跨站資源偽造(CSRF)

CSRF是一種會話劫持形式,用戶被迫在當前已通過身份驗證的應用程序上運行惡意操作。在 CSRF 攻擊中,攻擊者劫持真實用戶的會話,從而繞過非用戶的安全規則。 

為了防止CSRF 攻擊,您需要實現將在服務器端生成的令牌。csurf Node.js 包有助于生成有效的 CSRF 令牌。OWASP還提供了生成令牌的最佳實踐。 

路徑遍歷

路徑遍歷是指由于安全驗證薄弱而非法訪問文件服務器中的目錄的行為。在這種攻擊中,攻擊者能夠通過向 Web 應用程序注入惡意用戶輸入來訪問服務器文件。這種攻擊利用了訪問控制設置的易受攻擊的實現。 

為了防止這種形式的攻擊,允許列表起著關鍵作用。輸入驗證也起著至關重要的作用。 

結論

在本指南中,您了解了 Node.js 中的安全要點、可用于緩解漏洞攻擊的軟件包和庫,以及加強 Node.js 應用安全性的最佳實踐。當然,安全性應該是開發過程中的首要任務,并融入到您下一個 Node.js 應用的各個方面。 

文章來源:Guide to Security in Node.js

上一篇:

Angular破損的身份驗證指南:示例和預防措施

下一篇:

.NET XSS:示例與預防
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費