在构建 web 应用程序时,安全性通常是开发人员需要考虑的一个关键因素。使用 Express.js 框架开发 web 应用程序时,一个流行的工具是 Helmet,它可以帮助我们保障应用程序的安全性。但是,使用 Helmet 并不是百分之百安全的,需要一些最佳实践来确保应用程序的安全性和稳定性。
Helmet 简介
Helmet 是一个 Express.js 中间件,通过设置合适的 HTTP 头部来增加 web 应用程序的安全性。这些头部包括:
- Content Security Policy (CSP):防止跨站点脚本攻击 (XSS)。
- Cross-site Request Forgery (CSRF) 保护:防止 CSRF 攻击。
- DNS Prefetching 控制:防止 DNS 欺骗攻击。
- 禁用浏览器的特殊功能:比如 X-Powered-By 头部。
- 隐藏 X-Powered-By 头部信息:不暴露 web 服务器的技术栈和版本信息。
- 设置合适的 X-Content-Type-Options 头部:防止浏览器的 Mime 类型混淆攻击。
- 设置合适的 X-Frame-Options 头部:防止点击劫持攻击。
- 设置合适的 X-XSS-Protection 头部:启用浏览器的 XSS 保护。
安装 Helmet
使用 Helmert 极为简单,只需要使用 npm
一行代码来安装:
npm install helmet --save
在项目的入口文件中添加以下代码引入 Helmet:
const helmet = require('helmet'); app.use(helmet());
CSP
CSP 是一种安全策略,通过限制 web 页面中可执行的脚本源来减少 XSS 攻击的风险。CSP 的作用是确定来自哪些地址的资源可以被浏览器加载和执行。
const helmet = require('helmet'); app.use(helmet.contentSecurityPolicy({ directives: { defaultSrc: ["'self'"], styleSrc: ["'self'", 'maxcdn.bootstrapcdn.com'] } }));
在上面的代码中,default-src
表示默认资源来源,style-src
表示允许加载的 CSS 来源 URL。
CSRF 保护
CSRF 攻击是通过在已认证用户的浏览器上偷运行代码来实现的。为了在服务端验证 csrf 标签,我们需要使用第三方模块 nonce 来生成随机的 token,并将其存储在 cookie 中。
const helmet = require('helmet'); app.use(helmet()); app.use((req, res, next) => { res.locals.csrftoken = req.csrfToken(); next(); });
接着,在网页表单中添加如下 input 控件即可:
<input type="hidden" name="_csrf" value="{{csrftoken}}">
DNS prefetching 控制
DNS prefetching 是浏览器的一项功能,它可以提高网页的加载速度。但是,它也可能被用于进行 DNS 欺骗攻击,我们需要禁用这项功能来确保应用程序的安全性。
app.use(helmet.dnsPrefetchControl());
隐藏 X-Powered-By 头部
黑客可以利用 X-Powered-By 头部信息获得更多的关于 web 服务器技术栈和版本信息。为了保护我们的应用程序,我们需要隐藏这些信息。
app.disable('x-powered-by');
设置 X-Content-Type-Options 头部
X-Content-Type-Options 头部可以让浏览器强制执行响应的 MIME 类型,防止浏览器的类型混淆攻击。
app.use(helmet.contentTypeOptions());
设置 X-Frame-Options 头部
X-Frame-Options 头部可以防止点击劫持攻击。设置这个头部后,浏览器会阻止加载任何 frame 或 iframe,只允许 loading 相同域中的窗口。
app.use(helmet.frameguard({ action: 'sameorigin' }));
设置 X-XSS-Protection 头部
X-XSS-Protection 头部启用浏览器内置的 XSS 保护机制。通过在响应中包含 X-XSS-Protection 头部,保证浏览器激活内置的 XSS 过滤。
app.use(helmet.xssFilter());
总结
使用 Helmet 可以轻松地增加 web 应用程序的安全性,但是它并不是固若金汤。通过上述最佳实践,我们可以加强我们的 Express.js 应用程序的安全性,从而保护用户的隐私和敏感数据。始终保持最新的安全技能和实践,以确保应用程序最高水平的稳定性和安全性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6549eecb7d4982a6eb423ee3