helmet
是express
的中間件,經過設置各類header
來爲express
應用提供安全保護。雖然不能徹底杜絕安全問題,但確實能提供某種程度的保護。express
helmet
的使用很是簡單。首先使用npm
安裝helmet
:npm
npm install helmet --save
複製代碼
其次在express
應用中使用該中間件:瀏覽器
const express = require('express')
const helmet = require('helmet')
const app = express()
app.use(helmet())
複製代碼
helmet
包含了多箇中間件,每一箇中間件既能夠單獨使用,也能夠經過helmet()
集中配置。以是否禁用緩存的noCache
中間件爲例:緩存
單獨使用中間件:安全
app.use(helmet.noCache());
複製代碼
在helmet
函數中配置:bash
app.use(helmet({
noCache: true
}));
複製代碼
咱們接下來分別看一下幾個主要的中間件的做用.服務器
攻擊者能夠針對X-Powered-By
中暴露的服務器語言的漏洞進行攻擊。cookie
hidePoweredBy
能夠隱藏或混淆響應頭中的X-Powered-By
字段以迷惑攻擊者。app
app.use(helmet.hidePoweredBy());
複製代碼
也能夠經過設置假的字段值來欺騙攻擊者:xss
app.use(helmet.hidePoweredBy({setTo: 'PHP 4.2.0'}));
複製代碼
攻擊者騙取用戶點擊一個以iframe的方式隱藏的頁面,來獲取用戶的信息。
frameguard
經過設置x-frame-options
來容許iframe的域。
app.use(helmet.frameguard({action: 'deny'}));
複製代碼
設置X-XSS-Protection
提供基本的XSS防禦,避免基本的反射性XSS攻擊。
// Sets "X-XSS-Protection: 1; mode=block".
app.use(helmet.xssFilter());
複製代碼
若是響應頭中Content-Type
沒有指定,瀏覽器默認會自動嘗試識別響應體的內容以正確解析響應的文件。
設置 X-Content-Type-Options
爲nosniff
後,瀏覽器再也不進行自動識別。這意味着響應的文件類型若是與Content-Type
中聲明的不一致,將會被瀏覽器屏蔽掉。
app.use(helmet.noSniff());
複製代碼
有些站點可能提供了HTML文件的下載,部分IE瀏覽器中,該文件會在站點的上下文打開,存在腳本注入的風險。
設置X-Download-Options
爲noopen
不容許在在站點的上下文打開下載的HTML文件。
app.use(helmet.ieNoOpen());
複製代碼
設置Strict-Transport-Security
告知用戶在必定的時間段使用https
訪問。防止降級攻擊和cookie
劫持。
以下設置將來的90天內只使用https
訪問。
app.use(helmet.hsts({maxAge: 7776000}));
複製代碼
dns-prefetch
在提高網站性能的同時,潛在地會致使用戶隱私泄露、dns服務過載、頁面統計失真等問題。
dnsPrefetchControl
經過將X-DNS-Prefetch-Control
設置爲off
禁止瀏覽器進行DNS預解析。
app.use(helmet.dnsPrefetchControl())
複製代碼
以上簡單介紹了helmet
的用法和幾個默認開啓的中間件。helmet
經過添加各類響應頭來提供基本的安全防禦。剩餘未介紹到的中間件能夠查閱其官方文檔。