什么是 helmet
Helmet 是一个 Node.js 应用程序的中间件,它可以帮助你保护你的应用程序免受一些已知的 Web 漏洞攻击。例如,它可以帮助你:
- 设置响应头,以防止跨站点脚本攻击 (XSS)、点击劫持攻击和其他恶意攻击;
- 隐藏应用程序的技术细节,以防止攻击者了解你的应用程序的架构和版本信息;
- 配置 Content Security Policy (CSP)、HTTP Public Key Pinning (HPKP)、Strict Transport Security (HSTS) 等安全策略;
如何使用 helmet
在 Express.js 中使用 helmet 非常简单。只需安装 helmet:
npm install helmet
然后,在应用程序的入口文件中添加以下代码:
const helmet = require('helmet'); app.use(helmet());
这将应用 helmet 的所有默认安全中间件。你可以使用以下代码查看 helmet 为你的应用程序添加了哪些安全中间件:
console.log(helmet());
这将输出以下内容:
-- -------------------- ---- ------- - ---------------------- - ----------- - ----------- ----------- -------- ----------- --------------------- --- -------- ---------- --------- --------- --------------- ----------- ------- ---------- -------- ------------------------ ---------- ----------- ---------- ---------- -------------------------------- -------------- ----------- --------- ---------- --------- ------------------- ------------------------ -- - -- ------------------- - ------ ----- -- --------- - -------- ----- -- ----------- - ------- ------ -- -------------- - ------ ---- ------ -- ----- - ------- -------- -------- --- ------------------ ----- -- ----- - ------- -------- ------------------ ----- -- --------- - ------- -------- -- -------- - -- ----------------------------- - ------------------ ------ -- --------------- - ------- ------------- -- ---------- - - -
helmet 的安全中间件
contentSecurityPolicy
Content Security Policy (CSP) 是一种安全策略,它允许你控制浏览器从哪些源加载内容。通过配置 CSP,你可以防止跨站点脚本攻击 (XSS)、点击劫持攻击和其他恶意攻击。
默认情况下,helmet 会将 CSP 配置为只允许从应用程序自身加载内容。你可以使用以下代码自定义 CSP:
app.use( helmet.contentSecurityPolicy({ directives: { defaultSrc: ["'self'"], scriptSrc: ["'self'", 'trusted-cdn.com'] } }) );
dnsPrefetchControl
dnsPrefetchControl 中间件可以防止浏览器进行 DNS 预取。如果你的应用程序不需要进行 DNS 预取,可以使用以下代码禁用它:
app.use(helmet.dnsPrefetchControl({ allow: false }));
expectCt
expectCt 中间件可以启用 Certificate Transparency (CT),以防止恶意攻击者使用伪造的数字证书攻击你的应用程序。
默认情况下,helmet 会将 expect-ct 头设置为不强制执行。你可以使用以下代码启用它:
app.use(helmet.expectCt({ enforce: true }));
frameguard
frameguard 中间件可以防止点击劫持攻击。默认情况下,helmet 会将 X-Frame-Options 头设置为 DENY,这将阻止所有页面在 iFrame 中加载。你可以使用以下代码自定义 X-Frame-Options 头:
app.use(helmet.frameguard({ action: 'sameorigin' }));
hidePoweredBy
hidePoweredBy 中间件可以隐藏应用程序的技术细节,以防止攻击者了解你的应用程序的架构和版本信息。默认情况下,helmet 会将 X-Powered-By 头设置为 PHP 7.4.3。你可以使用以下代码自定义 X-Powered-By 头:
app.use(helmet.hidePoweredBy({ setTo: 'My Custom Server' }));
hpkp
HTTP Public Key Pinning (HPKP) 中间件可以启用公钥固定,以防止恶意攻击者使用伪造的数字证书攻击你的应用程序。
默认情况下,helmet 会将 HPKP 头设置为不强制执行。你可以使用以下代码启用它:
app.use( helmet.hpkp({ maxAge: 5184000, // 60 days in seconds sha256s: ['AbCdEf123=', 'Xyz987='], includeSubDomains: true }) );
hsts
Strict Transport Security (HSTS) 中间件可以启用严格的传输安全。当浏览器访问你的应用程序时,它会强制使用 HTTPS 协议。
默认情况下,helmet 会将 HSTS 头设置为 60 天。你可以使用以下代码自定义 HSTS 头:
app.use(helmet.hsts({ maxAge: 31536000 }));
ieNoOpen
ieNoOpen 中间件可以防止 Internet Explorer 浏览器打开未知的 MIME 类型文件。
默认情况下,helmet 会将 X-Download-Options 头设置为 noopen。你可以使用以下代码自定义 X-Download-Options 头:
app.use(helmet.ieNoOpen({ action: 'deny' }));
noSniff
noSniff 中间件可以防止浏览器将响应的 MIME 类型自动检测为不正确的类型。
默认情况下,helmet 会将 X-Content-Type-Options 头设置为 nosniff。你可以使用以下代码自定义 X-Content-Type-Options 头:
app.use(helmet.noSniff());
permittedCrossDomainPolicies
permittedCrossDomainPolicies 中间件可以配置跨域策略。默认情况下,helmet 会将 X-Permitted-Cross-Domain-Policies 头设置为 none,这将防止浏览器使用 Adobe Flash 跨域访问你的应用程序。你可以使用以下代码自定义 X-Permitted-Cross-Domain-Policies 头:
app.use( helmet.permittedCrossDomainPolicies({ permittedPolicies: 'by-content-type' }) );
referrerPolicy
referrerPolicy 中间件可以配置 referrer 策略。默认情况下,helmet 会将 Referrer-Policy 头设置为 no-referrer。你可以使用以下代码自定义 Referrer-Policy 头:
app.use(helmet.referrerPolicy({ policy: 'strict-origin' }));
xssFilter
xssFilter 中间件可以启用浏览器的内置 XSS 过滤器。
默认情况下,helmet 会将 X-XSS-Protection 头设置为 1; mode=block。你可以使用以下代码自定义 X-XSS-Protection 头:
app.use(helmet.xssFilter({ setOnOldIE: true }));
结论
使用 helmet 可以帮助你保护你的应用程序免受一些已知的 Web 漏洞攻击。在 Express.js 中使用 helmet 非常简单,只需安装 helmet 并在应用程序的入口文件中添加一行代码即可。在添加 helmet 后,你可以使用 console.log(helmet()) 查看 helmet 为你的应用程序添加了哪些安全中间件,并自定义这些中间件以满足你的特定需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6742a42adb344dd98de07932