Helmet之Strict-Transport-Security实战:如何用HSTS强制HTTPS并正确设置preload
Helmet之Strict-Transport-Security实战如何用HSTS强制HTTPS并正确设置preload【免费下载链接】helmetHelp secure Express apps with various HTTP headers项目地址: https://gitcode.com/gh_mirrors/he/helmet在 Express 应用中使用Helmet安全中间件时Strict-Transport-Security简称HSTS是保护用户免受中间人攻击的关键 HTTP 响应头。本文带你用 Helmet 快速启用 HSTS 强制 HTTPS 访问并讲清maxAge、includeSubDomains、preload三个参数的正确用法让你一次性配置到位。一、HSTS 是什么为什么需要它 ️假设用户第一次访问你的网站时走了不安全的http://链接攻击者有可能劫持这次通信。HSTS 的作用就是告诉浏览器记住在未来一段时间内访问这个域名只能走 HTTPS直接用 HTTP 的请求一律强制转成 HTTPS。一旦浏览器收到并记住了这个头用户之后即使手滑输入http://example.com浏览器也会在本地自动改成https://从根源上杜绝了首次请求被劫持的窗口。需要特别理解一点HSTS 头本身不完成跳转它只是让浏览器记住域名要强制 HTTPS。对真正访问 HTTP 用户的 301 重定向通常由反向代理Nginx 等配合完成。二、Helmet 默认帮你开启 HSTS ✅在 Helmet 中你什么都不用写HSTS 头就已经生效了app.use(helmet());默认发出的响应头为Strict-Transport-Security: max-age31536000; includeSubDomains含义记住365 天31536000 秒且策略自动覆盖所有子域名。相关实现位于 index.ts默认值365 * 24 * 60 * 60在 index.ts 中定义。三、三个关键参数速查表参数类型默认值作用maxAge数字秒31536000365天浏览器记住策略的时长单位是秒不是天includeSubDomains布尔true策略是否扩展到所有子域名preload布尔false声明你有意将站点加入浏览器预加载列表三种常见配置效果对比// 1. 基础自定义时长 // → max-age123456; includeSubDomains helmet({ strictTransportSecurity: { maxAge: 123456 } }) // 2. 不含子域名 // → max-age123456 helmet({ strictTransportSecurity: { maxAge: 123456, includeSubDomains: false } }) // 3. 申请预加载 // → max-age63072000; includeSubDomains; preload helmet({ strictTransportSecurity: { maxAge: 63072000, preload: true } })另外strictTransportSecurity也有兼容旧版写法的别名hsts见 index.ts。四、正确设置 preload 的完整步骤 开启preload: true是告诉浏览器厂商我想被写进各大浏览器的内置 HSTS 预加载列表。被收录后即使用户第一次访问你的域名也直接强制 HTTPS安全性再上一个台阶。提交资格硬性要求缺一不可✅maxAge至少为1 年31536000 秒✅includeSubDomains必须为true✅ 主域名和所有子域名都必须支持 HTTPS✅ 域名必须支持 SNI推荐配置app.use( helmet({ strictTransportSecurity: { maxAge: 31536000, // 至少 1 年 includeSubDomains: true, // 必须开启 preload: true, }, }), );配置完成后到 hstspreload.org 提交域名即可进入审核队列。更多说明可参考模块内的 README.md。五、新手最容易踩的 4 个坑 ⚠️参数名拼错会直接报错。Helmet 做了严格校验见 index.ts写成小写maxage→ 报错提示你应该是maxAge写成includeSubdomains小写 d→ 报错提示正确写法是includeSubDomains这些校验行为在 strict-transport-security.test.ts 中有完整测试覆盖写错时第一时间就能发现问题不会静默失效。maxAge单位是秒。maxAge: 365只等于约 6 分钟而不是 365 天。传小数会被向下取整传负数、NaN、字符串都会抛错。HTTP 明文下该头会被浏览器忽略。所以它不会破坏纯 HTTP 的本地开发调试但要注意如果多个本地应用共用localhostHSTS 记忆可能引发意外的强制跳转。遇到这种情况可在开发环境关闭该头helmet({ strictTransportSecurity: false });先确认全站含所有子域HTTPS 就绪再开includeSubDomains。一旦开启任何一个未配好证书的mail.你的域名都会无法访问——这是双刃剑先自查再打开。六、如何验证配置成功打开浏览器开发者工具 → Network → 查看任意响应头确认出现Strict-Transport-Security用curl -I https://你的域名查看响应头中是否包含预期的max-age与preload指令预加载提交后在chrome://net-internals/#hsts中可查询域名是否已入列表七、小结与延伸阅读场景推荐配置快速上线直接用默认1 年 子域名提交浏览器预加载maxAge ≥ 1年 includeSubDomains preload纯 API 无子域业务includeSubDomains: false即可HSTS 是 Helmet 13 个安全响应头中最一劳永逸的一个建议所有面向公网的 Express 应用默认开启。更多配置细节可查看 README.md 中的 HSTS 章节或浏览 CHANGELOG.md 了解该模块的版本演进。【免费下载链接】helmetHelp secure Express apps with various HTTP headers项目地址: https://gitcode.com/gh_mirrors/he/helmet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考