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