网站搜索

TypeScript - 添加 HSTS 头


我需要在这个文件中添加 HSTS 头,但我不确定该如何操作。

import { injectable, inject } from 'tsyringe';
import { NextFunction, Request, Response } from 'express';

import * as Types from '../../types';

@injectable()
class EncryptionController {

  constructor(@inject('EncryptionService') private service: Types.EncryptionService) { }

  public encrypt = async (req: Request, res: Response<Types.EncryptResponsePayload | Types.ServiceError>, next: NextFunction) => {
    try {
      
      const { publicKeys, payload } = req.body as Types.EncryptRequest;
      const response = await this.service.encrypt(payload, publicKeys);
      
      res.status(200).json(response);
    } catch (error) {
      if (error.message === 'not found' || error.message === 'Secret not found') {
        res.status(404).json({ message: error.message });
      } else {
        res.status(400).json({ message: error.message });
      }
    }
  }

我会感激任何关于这方面的指导

答案#1

在响应中,你可以调用 res.setHeader(headerName, headerValue) 来设置任何头部,包括 HSTS 头部。通常你会想做类似这样的操作:

res.setHeader('Strict-Transport-Security', 'max-age=3600; includeSubDomains');

这会将 HSTS 启用 1 小时——这是第一次测试的一个好值,但一旦你确认一切正常,你可能应该将其增加到类似 31536000(1 年)的值。

你需要在你的 res.status()... 行之前的某个地方设置这个头。

这会为整个网站及其他子域启用 HSTS,但仅在客户端请求这个特定端点时生效。在大多数情况下,假设你有很多其他端点,你希望在所有响应中发送 HSTS 响应头。为此,你可以使用 Express 中间件来添加这些头信息。你可以自己编写,或者使用 Helmet(例如 app.use(helmet.hsts())),它可以为你全局且轻松地实现这一点以及许多其他良好的安全实践。