【Express.js】安全性

安全性

在 Web 应用中,安全亦是相当重要的一环,在正式的场景下,数据安全尤为重要。

使用高稳定版本的 Express

Express 2.x 和 Express 3.x 已不再维护,其中存在的安全性和性能问题不会得到修复,请尽可能的使用或迁移到 Express 4.x

使用 TLS

如果应用需要处理或传输敏感数据,请使用 TLS 来保护连接和数据,TLS 在客户端发起阶段对其加密,从而防止初步的黑客行为。

使用 Helmet

helmet.js 是一个 Express 中间件,用于设置 HTTP 标头来帮助 Express 应用免受一些常规的 Web 漏洞:

  • CSP 设置标头以防止跨站脚本攻击和注入,Content-Security-Policy
  • hidePoweredBy 删除 X-Powered-By 标头
  • hsts 设置强制与服务器建立安全连接(https)Strict-Transport-Security
  • noCachePragma 禁用客户端缓存 Cache-Control
  • noSniff 设置以防止浏览器从声明内容类型嗅探响应的 MIME
  • frame 设置以防止点击劫持 X-Frame-Options
  • xssFilter 设置以禁用 XSS 缺陷脚本 X-XSS-Protection

使用方法:

shell 复制代码
npm install helmet --save

挂载到 app:

javascript 复制代码
const helmet = require("helmet")();

app.use(helmet);

为确保 Cookie 不会打开您的应用而受攻击,请不要使用默认 Cookie 会话名称:

javascript 复制代码
const Session = require("express-session");

app.set("trust proxy", 1);
app.use(Session({
  secret: 'express-demo',
  name: 'sessionX'
}));

此外,设置一些安全选项来确保 Session 安全:

javascript 复制代码
app.use(Session({
  name: "sessionX",
  keys: ["evp-key-1", "evp-key-2"],
  cookie: {
    secure: true,
    httpOnly: true,
    domain: 'express-demo.com',
    path: 'security',
    expires: new Date(Date.now() + 60 * 60 * 1000) // 1 hour
  }
}));

争对暴力攻击的端点保护

如争对同一用户或同一IP的短期内大量失败行为进行监测,进行适当的用户封禁和IP封禁。

rate-limiter-flexible 提供了相关的技术支持,文档详见此处

确保依赖安全

您正在使用的 npm 包也许存在安全漏洞,你可以使用 npm audit 来分析依赖树,并通过 npm audit fix 进行简单的修复,如果你想要更精细的控制依赖安全,可以尝试一下 snyk.js:

  • 安装
shell 复制代码
npm install -g snyk
  • 检测漏洞
shell 复制代码
synk test
  • 引导修复
shell 复制代码
synk wizard

其它注意事项

以下是优秀的Node.js 安全检查表中的一些进一步建议。有关这些建议的所有详细信息,请参阅该博客文章:

  • 使用csurf中间件防止跨站点请求伪造(CSRF)。
  • 始终筛选和清理用户输入,以防止跨站点脚本 (XSS) 和命令注入攻击。
  • 使用参数化查询或预准备语句防御 SQL 注入攻击。
  • 使用开源sqlmap工具检测应用中的 SQL 注入漏洞。
  • 使用nmapsslyze工具测试 SSL 密码、密钥和重新协商的配置以及证书的有效性。
  • 使用安全正则表达式确保您的正则表达式不容易受到正则表达式拒绝服务攻击。

下一节-健康检查

相关推荐
仰望星空@脚踏实地5 分钟前
Spring Boot Web 服务单元测试设计指南
spring boot·后端·单元测试
军训猫猫头10 分钟前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
爱分享的程序员15 分钟前
前端面试专栏-算法篇:18. 查找算法(二分查找、哈希查找)
前端·javascript·node.js
羊小猪~~18 分钟前
数据库学习笔记(十七)--触发器的使用
数据库·人工智能·后端·sql·深度学习·mysql·考研
翻滚吧键盘20 分钟前
vue 条件渲染(v-if v-else-if v-else v-show)
前端·javascript·vue.js
你这个年龄怎么睡得着的22 分钟前
为什么 JavaScript 中 'str' 不是对象,却能调用方法?
前端·javascript·面试
用户83249514173224 分钟前
JAVA 版本多版本切换 - 傻瓜式操作工具
后端
真的想上岸啊24 分钟前
学习C++、QT---18(C++ 记事本项目的stylesheet)
开发语言·c++·学习
estarlee27 分钟前
随机昵称网名API接口教程:轻松获取百万创意昵称库
后端
南屿im29 分钟前
JavaScript 手写实现防抖与节流:优化高频事件处理的利器
前端·javascript