HTTP Strict Transport Security 默认启用

原文链接

简介:通过设置Strict-Transport-Security响应头来强制使用HTTPS。

攻击方式

虽然有一些瑕疵,但HTTPS是一种安全的协议。而HTTP就非常糟糕了。“纯”HTTP协议很容易受到中间人攻击,因为所有的发送内容都没有经过加密。我认为HTTP就是一种“裸奔”。

如果您的网站是HTTP而不是HTTPS,那黑客做梦都会笑醒了。

扩展阅读

Header详解

Strict-Transport-Security响应头告诉浏览器坚持HTTPS,绝不访问不安全的HTTP。下面的例子表示浏览器检测到该响应头后,在接下来的60天里只通过HTTPS访问网站:

Strict-Transport-Security: max-age=5184000
1

需要注意的是,响应报头不会告诉用户将HTTP切换到HTTPS,而是告诉使用HTTPS的用户继续保持。若使用Express,您可以使用express-enforces-ssl模块强制使用HTTPS。Koa可以使用koa-sslify

扩展阅读:

代码

Helmet的HSTS中间件并不复杂,它帮助您设置Strict-Transport-Security响应报头。

您可以作为Helmet的内部方法使用:

// Make sure you run "npm install helmet" to get the Helmet package.
const helmet = require('helmet')

// Sets "Strict-Transport-Security: max-age=5184000; includeSubDomains".
const sixtyDaysInSeconds = 5184000
app.use(helmet.hsts({
  maxAge: sixtyDaysInSeconds
}))
1
2
3
4
5
6
7
8

也可以单独使用:

// Make sure you run "npm install hsts" to get the hsts package.
const hsts = require('hsts')

// Sets "Strict-Transport-Security: max-age=5184000; includeSubDomains".
const sixtyDaysInSeconds = 5184000
app.use(hsts({
  maxAge: sixtyDaysInSeconds
}))
1
2
3
4
5
6
7
8

涵盖子域名

默认情况下,includeSubDomains值为ture。若不想设置它,请将includeSubDomains设置为false

// Sets "Strict-Transport-Security: max-age=5184000".
app.use(helmet.hsts({
  maxAge: sixtyDaysInSeconds,
  includeSubDomains: false
}))
1
2
3
4
5

按条件设置

该响应头是默认启用的,因为在不安全的HTTP协议中它会被忽略。您也可以按条件设置:

const hstsMiddleware = helmet.hsts({ /* ... */ })

app.use((req, res, next) {
  if (req.secure) {
    hstsMiddleware(req, res, next)
  } else {
    next()
  }
})
1
2
3
4
5
6
7
8
9

在Chrome中预加载HSTS

有些浏览器允许您提交站点的HSTS以整合到浏览器中。您可以使用以下代码将preload添加到报头中。您可以在hstspreload.org上提交您的站点并检查您的资格。

app.use(helmet.hsts({
  // Must be at least 1 year to be approved
  // 必须设置为至少1年才能通过审核
  maxAge: 31536000,

  // Must be enabled to be approved
  // 必须启用这一项才能通过审核
  includeSubDomains: true,
  preload: true
}))
1
2
3
4
5
6
7
8
9
10
上次更新: 1/19/2020, 5:49:54 PM