?
This document uses PHP Chinese website manual Release
術(shù)語“生產(chǎn)”指的是軟件生命周期中的一個階段,即應(yīng)用程序或API通常可供其最終用戶或消費者使用。相反,在“開發(fā)”階段,您仍然在積極編寫和測試代碼,并且該應(yīng)用程序不對外部訪問開放。相應(yīng)的系統(tǒng)環(huán)境分別被稱為生產(chǎn)和開發(fā)環(huán)境。
開發(fā)和生產(chǎn)環(huán)境通常以不同的方式建立,并具有完全不同的要求。生產(chǎn)中可能無法接受發(fā)展中的問題。例如,在開發(fā)環(huán)境中,您可能需要詳細記錄錯誤以進行調(diào)試,而同樣的行為可能會成為生產(chǎn)環(huán)境中的安全問題。在開發(fā)過程中,您無需擔(dān)心可擴展性,可靠性和性能,而這些擔(dān)憂在生產(chǎn)中變得至關(guān)重要。
注意:如果您認(rèn)為您發(fā)現(xiàn)了Express中的安全漏洞,請參閱安全策略和過程。
生產(chǎn)中的Express應(yīng)用程序的安全最佳實踐包括:
請勿使用Express的已棄用或易受攻擊的版本
使用TLS
使用頭盔
使用cookies安全
確保您的依賴性是安全的
避免其他已知的漏洞
額外的考慮
Express 2.x和3.x不再維護。這些版本中的安全和性能問題不會被修復(fù)。不要使用它們!如果您尚未移至版本4,請按照遷移指南進行操作。
同時確保您未使用安全更新頁面上列出的任何易受攻擊的Express版本。如果是,請更新到其中一個穩(wěn)定版本,最好是最新版本。
如果您的應(yīng)用處理或傳輸敏感數(shù)據(jù),請使用傳輸層安全性(TLS)來保護連接和數(shù)據(jù)。該技術(shù)在將數(shù)據(jù)從客戶端發(fā)送到服務(wù)器之前對其進行加密,從而防止一些常見(并且容易)的黑客攻擊。雖然Ajax和POST請求可能不明顯,并且在瀏覽器中似乎“隱藏”,但它們的網(wǎng)絡(luò)流量很容易受到數(shù)據(jù)包嗅探和中間人攻擊。
您可能熟悉安全套接字層(SSL)加密。TLS只是SSL的下一個進程(https://msdn.microsoft.com/en-us/library/windows/desktop/aa380515(v = vs.85%29.aspx)。換句話說,如果您使用的是以前的SSL,可以考慮升級到TLS,一般來說,我們推薦Nginx來處理TLS,關(guān)于在Nginx(和其他服務(wù)器)上配置TLS的很好的參考,請參閱推薦的服務(wù)器配置(Mozilla Wiki)。
此外,獲得免費TLS證書的便捷工具還包括由互聯(lián)網(wǎng)安全研究組(ISRG)提供的免費,自動化和開放的認(rèn)證機構(gòu)(CA)Let's Encrypt。
通過適當(dāng)設(shè)置HTTP標(biāo)頭,頭盔可以幫助保護您的應(yīng)用免受一些著名的網(wǎng)絡(luò)漏洞攻擊。
頭盔實際上只是九個較小的中間件功能的集合,它們設(shè)置了與安全相關(guān)的HTTP頭文件:
csp設(shè)置Content-Security-Policy
標(biāo)題以幫助防止跨站腳本攻擊和其他跨站點注入。
hidePoweredBy刪除X-Powered-By
標(biāo)題。
hpkp添加公共密鑰固定標(biāo)頭以防止偽造證書的中間人攻擊。
hsts設(shè)置Strict-Transport-Security
標(biāo)頭,強制執(zhí)行到服務(wù)器的安全(HTTP over SSL / TLS)連接。
ieNoOpen設(shè)置X-Download-Options
為IE8 +。
noCache設(shè)置Cache-Control
和Pragma標(biāo)題來禁用客戶端緩存。
noSniff設(shè)置X-Content-Type-Options
為防止瀏覽器從MIME中嗅探到已聲明的內(nèi)容類型的響應(yīng)。
frameguard設(shè)置X-Frame-Options
標(biāo)題以提供點擊劫持保護。
xssFilter設(shè)置X-XSS-Protection
為在最新的Web瀏覽器中啟用跨站點腳本(XSS)過濾器。
像其他模塊一樣安裝頭盔:
$ npm install --save helmet
然后在代碼中使用它:
// ...var helmet = require('helmet')app.use(helmet())// ...
如果你不想使用頭盔,那么至少要禁用X-Powered-By
頭部。攻擊者可以使用此標(biāo)頭(默認(rèn)情況下啟用)檢測運行Express的應(yīng)用程序,然后啟動專門針對性的攻擊。
所以,最好的做法是用app.disable()
方法關(guān)閉標(biāo)題:
app.disable('x-powered-by')
如果你使用helmet.js
它,它為你照顧這個。
注意:禁用X-Powered-By header
并不能防止復(fù)雜的攻擊者確定應(yīng)用程序正在運行Express。它可能會阻止偶然的利用,但還有其他方式可以確定應(yīng)用程序正在運行Express。
為確保cookie不會將您的應(yīng)用打開,請不要使用默認(rèn)會話cookie名稱并適當(dāng)設(shè)置cookie安全選項。
有兩個主要的中間件cookie會話模塊:
快速會話,取代express.session
Express 3.x內(nèi)置的中間件。
cookie會話,用于替換express.cookieSession
Express 3.x中內(nèi)置的中間件。
這兩個模塊的主要區(qū)別是它們?nèi)绾伪4鎐ookie會話數(shù)據(jù)。該快遞會話服務(wù)器上的中間件存儲會話數(shù)據(jù); 它只會將會話ID保存在cookie本身中,而不是會話數(shù)據(jù)。默認(rèn)情況下,它使用內(nèi)存中的存儲,而不是為生產(chǎn)環(huán)境設(shè)計的。在制作中,您需要設(shè)置一個可擴展的會話存儲; 請參閱兼容會話存儲的列表。
相反,Cookie會話中間件實現(xiàn)了cookie支持的存儲:它將整個會話序列化為cookie,而不僅僅是會話密鑰。僅當(dāng)會話數(shù)據(jù)相對較小并且易于編碼為原始值(而不是對象)時才使用它。雖然瀏覽器應(yīng)支持每個cookie至少4096個字節(jié),但為確保不超過限制,請不要超過每個域4093個字節(jié)的大小。此外,請注意,客戶端可以看到Cookie數(shù)據(jù),因此如果有任何理由保證其安全或模糊,那么Express-session可能是更好的選擇。
使用默認(rèn)會話cookie名稱可以打開您的應(yīng)用程序以進行攻擊。構(gòu)成的安全問題類似于X-Powered-By
:潛在的攻擊者可以使用它來指紋服務(wù)器并相應(yīng)地針對攻擊。
為了避免這個問題,使用通用的cookie名稱; 例如使用快速會話中間件:
var session = require('express-session')app.set('trust proxy', 1) // trust first proxyapp.use(session({ secret: 's3Cur3', name: 'sessionId'}))
設(shè)置以下cookie選項以增強安全性:
secure
- 確保瀏覽器僅通過HTTPS發(fā)送Cookie。
httpOnly
- 確保cookie僅通過HTTP(S)而不是客戶端JavaScript發(fā)送,有助于防止跨站腳本攻擊。
domain
- 表示cookie的域名; 使用它來與請求URL的服務(wù)器的域進行比較。如果它們匹配,則檢查下一個路徑屬性。
path
- 表示Cookie的路徑; 用它來比較請求路徑。如果這個和域名匹配,然后發(fā)送請求中的cookie。
expires
- 用于設(shè)置持久性cookie的到期日期。
以下是使用Cookie會話中間件的示例:
var session = require('cookie-session') var express = require('express') var app = express() var expiryDate = new Date(Date.now() + 60 * 60 * 1000) // 1 hour app.use(session({ name: 'session', keys: ['key1', 'key2'], cookie: { secure: true, httpOnly: true, domain: 'example.com', path: 'foo/bar', expires: expiryDate }}))
使用npm來管理你的應(yīng)用程序的依賴是強大和方便的。但是,您使用的軟件包可能包含嚴(yán)重的安全漏洞,這些漏洞也可能會影響您的應(yīng)用程序。您的應(yīng)用程序的安全性與您的依賴關(guān)系中的“最薄弱的環(huán)節(jié)”一樣強大。
使用以下兩種工具中的一種或兩種來幫助確保您使用的第三方軟件包的安全性:nsp和Snyk。
nsp是一個命令行工具,用于檢查Node Security項目漏洞數(shù)據(jù)庫,以確定您的應(yīng)用程序是否使用具有已知漏洞的軟件包。安裝如下:
$ npm i nsp -g
使用此命令提交npm-shrinkwrap.json
/ package.json
文件進行驗證,以nodesecurity.io:
$ nsp check
Snyk提供了一個命令行工具和一個Github集成,可以檢查您的應(yīng)用程序與Snyk的開源漏洞數(shù)據(jù)庫是否存在相關(guān)性中的任何已知漏洞。按如下所示安裝CLI:
$ npm install -g snyk $ cd your-app
使用此命令測試您的應(yīng)用程序是否存在漏洞:
$ snyk test
使用此命令打開一個向?qū)?,引?dǎo)您完成應(yīng)用更新或修補程序以修復(fù)找到的漏洞的過程:
$ snyk wizard
留意Node Security Project或Snyk建議,這些建議可能會影響Express或您的應(yīng)用使用的其他模塊。一般來說,這些數(shù)據(jù)庫是關(guān)于節(jié)點安全性的知識和工具的絕佳資源。
最后,Express應(yīng)用程序 - 就像任何其他網(wǎng)絡(luò)應(yīng)用程序 - 可能容易受到各種基于Web的攻擊。熟悉已知的網(wǎng)絡(luò)漏洞并采取預(yù)防措施以避免它們。
以下是一些優(yōu)秀的Node.js安全檢查表的進一步建議。有關(guān)這些建議的所有詳細信息,請參閱該博客文章:
實施限速以防止對認(rèn)證的暴力攻擊。一種方法是使用StrongLoop API網(wǎng)關(guān)來執(zhí)行限速策略?;蛘?,您可以使用中間件(如express-limiter),但這樣做會需要您稍微修改代碼。
使用csurf中間件來防止跨站請求偽造(CSRF)。
始終過濾和清理用戶輸入以防止跨站點腳本(XSS)和命令注入攻擊。
通過使用參數(shù)化查詢或預(yù)準(zhǔn)備語句來防御SQL注入攻擊。
使用開源sqlmap工具來檢測應(yīng)用程序中的SQL注入漏洞。
使用nmap和sslyze工具測試SSL密碼,密鑰和重新協(xié)商的配置以及證書的有效性。
使用safe-regex來確保您的正則表達式不受正則表達式拒絕服務(wù)攻擊的影響。