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

// Store password hash in database

});

});

通過(guò)單獨(dú)的函數(shù)調(diào)用,您可以自動(dòng)生成鹽和哈希,如下所示。 

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

// Store password hash in database

});

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

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

4. Validator.js

列表中的下一個(gè)是 Validator,它是一個(gè)輸入驗(yàn)證模塊。它強(qiáng)制要求用戶(hù)輸入符合要求。同樣,它確保輸入的正確性。此列表包括您可以使用 Validator 包配置的所有驗(yàn)證器。 

5. ESLint 插件

提高 Node.js 應(yīng)用安全性的另一種方法是集成 ESLint,這是一個(gè) linting 安全插件,可幫助在開(kāi)發(fā)過(guò)程中識(shí)別易受攻擊的 Node.js 代碼。易受攻擊的代碼實(shí)現(xiàn)包括不安全的正則表達(dá)式、for循環(huán)內(nèi)的“await”關(guān)鍵字等。  

安全最佳實(shí)踐

無(wú)論您使用 Node.js 構(gòu)建什么應(yīng)用程序,都應(yīng)該在開(kāi)發(fā)的第一階段執(zhí)行關(guān)鍵的安全程序。

因此,為了保證 Node.js 應(yīng)用程序安全且沒(méi)有漏洞,在構(gòu)建 Node.js 應(yīng)用程序時(shí)實(shí)施必要的安全最佳實(shí)踐非常重要。我們將在本節(jié)中介紹其中的幾個(gè)。 

始終審計(jì) Node 模塊

首先,始終審核您在項(xiàng)目中使用的每個(gè)節(jié)點(diǎn)模塊以進(jìn)行漏洞檢查是必不可少的。審核有助于確認(rèn)哪些軟件包可以升級(jí)。當(dāng)您審核軟件包時(shí),您也在確認(rèn)軟件包的安全性。 

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

始終使用速率限制

其次,暴力破解之類(lèi)的攻擊是 Node.js 應(yīng)用常見(jiàn)的安全威脅,而登錄路由是這種攻擊最常針對(duì)的目標(biāo)。速率限制有助于限制暴力破解攻擊的影響。Node.js ratelimiter包有助于將速率限制集成到您的 Node.js 應(yīng)用中。使用 ratelimiter 模塊,您可以根據(jù)用戶(hù)的 ID 限制中間件的實(shí)現(xiàn)。 

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軟件包還可以進(jìn)行速率限制,以減輕暴力破解和拒絕服務(wù) (DoS) 攻擊。 

使用 TLS/SSL 進(jìn)行數(shù)據(jù)傳輸

第三,在將數(shù)據(jù)從一層傳輸?shù)搅硪粚訒r(shí),數(shù)據(jù)保密性非常重要,以防止?jié)撛诠粽叩男崽健Mㄟ^(guò)加密保護(hù)數(shù)據(jù)傳輸?shù)囊环N常見(jiàn)方法是使用傳輸層安全性 (TLS) 和安全套接字層 (SSL)。需要澄清的是,SSL 對(duì)客戶(hù)端-服務(wù)器連接進(jìn)行端到端加密,而 TLS 保護(hù)密碼數(shù)據(jù)和信用卡詳細(xì)信息等敏感信息。 

轉(zhuǎn)義輸出

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

記錄并監(jiān)控您的應(yīng)用程序

最后,服務(wù)器上的負(fù)載可能會(huì)導(dǎo)致 DoS,從而導(dǎo)致應(yīng)用程序停機(jī)。因此,監(jiān)控服務(wù)器的傳入和傳出流量非常重要,當(dāng)服務(wù)器處于極端負(fù)載時(shí),您可以隨時(shí)收到警報(bào)。如果您的服務(wù)器不是因?yàn)闃O端負(fù)載而崩潰,而是由于安全攻擊,則必須正確使用日志來(lái)了解安全攻擊發(fā)生的方式和時(shí)間。Bunyan Node.js模塊有助于高效記錄您的 Node.js 服務(wù)。TooBusy Node.js 模塊是監(jiān)控 Node.js 應(yīng)用程序的重要工具 

OWASP Node.js 安全備忘單包含全面的安全最佳實(shí)踐列表。了解安全攻擊以及緩解這些攻擊的主要方法是安全的關(guān)鍵,這也是下一節(jié)的內(nèi)容。 

最常見(jiàn)的 Node.js 安全攻擊

Node.js 有幾種安全攻擊,但我們將在本部分詳細(xì)回顧常見(jiàn)的攻擊。 

SQL 注入

SQL 注入涉及通過(guò)用戶(hù)輸入的數(shù)據(jù)向應(yīng)用程序插入 SQL 查詢(xún)。這些攻擊利用應(yīng)用程序中要求用戶(hù)輸入的區(qū)域。實(shí)施 SQL 注入攻擊的攻擊者在成功攻擊后將能夠訪問(wèn)應(yīng)用程序的數(shù)據(jù)庫(kù)。您可以在 StackHawk 上閱讀有關(guān) SQL 注入的更多信息。 

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

跨站點(diǎn)腳本 (XSS)

XSS涉及將客戶(hù)端腳本注入網(wǎng)站。利用 XSS,攻擊者能夠操縱 Web 應(yīng)用程序,目的是向 Web 應(yīng)用程序的用戶(hù)發(fā)送惡意代碼。XSS 攻擊的目的是竊取用戶(hù)的數(shù)據(jù)或控制 Web 應(yīng)用程序。 

為了防止 XSS 攻擊,你需要根據(jù)項(xiàng)目需求使用安全的 HTTP 標(biāo)頭。上面提到的 Helmet 提供了設(shè)置安全 HTTP 標(biāo)頭的中間件函數(shù)。 

命令注入

命令注入是指注入輸入,改變易受攻擊的應(yīng)用程序中的有效合法命令,以便執(zhí)行針對(duì)操作系統(tǒng)的非法命令。這種攻擊主要針對(duì)系統(tǒng) shell。輸入注入??可以來(lái)自用戶(hù)可以修改的任何來(lái)源,例如表單。這種攻擊以系統(tǒng) shell 為目標(biāo)。 

再次強(qiáng)調(diào),為了防止注入攻擊,輸入驗(yàn)證是關(guān)鍵。 

跨站資源偽造(CSRF)

CSRF是一種會(huì)話(huà)劫持形式,用戶(hù)被迫在當(dāng)前已通過(guò)身份驗(yàn)證的應(yīng)用程序上運(yùn)行惡意操作。在 CSRF 攻擊中,攻擊者劫持真實(shí)用戶(hù)的會(huì)話(huà),從而繞過(guò)非用戶(hù)的安全規(guī)則。 

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

路徑遍歷

路徑遍歷是指由于安全驗(yàn)證薄弱而非法訪問(wèn)文件服務(wù)器中的目錄的行為。在這種攻擊中,攻擊者能夠通過(guò)向 Web 應(yīng)用程序注入惡意用戶(hù)輸入來(lái)訪問(wèn)服務(wù)器文件。這種攻擊利用了訪問(wèn)控制設(shè)置的易受攻擊的實(shí)現(xiàn)。 

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

結(jié)論

在本指南中,您了解了 Node.js 中的安全要點(diǎn)、可用于緩解漏洞攻擊的軟件包和庫(kù),以及加強(qiáng) Node.js 應(yīng)用安全性的最佳實(shí)踐。當(dāng)然,安全性應(yīng)該是開(kāi)發(fā)過(guò)程中的首要任務(wù),并融入到您下一個(gè) Node.js 應(yīng)用的各個(gè)方面。 

文章來(lái)源:Guide to Security in Node.js

上一篇:

Angular破損的身份驗(yàn)證指南:示例和預(yù)防措施

下一篇:

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

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門(mén)場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)