@nestjs/swagger:是不是可以防止网络钓鱼?

Posted

技术标签:

【中文标题】@nestjs/swagger:是不是可以防止网络钓鱼?【英文标题】:@nestjs/swagger: Is it possible to prevent phishing?@nestjs/swagger:是否可以防止网络钓鱼? 【发布时间】:2021-09-07 22:28:12 【问题描述】:

我在 Nest.js 应用程序中使用 @nestjs/swagger 来生成 Swagger 文档。

在文档中我们有一个简单的例子,比如

      const config = new DocumentBuilder()
        .setTitle('Cats example')
        .setDescription('The cats API description')
        .setVersion('1.0')
        .addTag('cats')
        .build();
      const document = SwaggerModule.createDocument(app, config);
      SwaggerModule.setup('api', app, document);

通过这个实现,我遇到了安全问题,这可能会使攻击者面临网络钓鱼攻击。例如,我们有一个招摇页面

https://petstore.swagger.io/

攻击者可以在 URL 中添加查询参数,例如

https://petstore.swagger.io/?url=https://27.rs/card.yaml#/default/get_

这可能会导致安全问题。有什么办法可以预防吗?我们可以禁用 Swagger URL 的查询参数,或者清除它吗?转换

https://petstore.swagger.io/?url=https://27.rs/card.yaml#/default/get_ => https://petstore.swagger.io/

作为第 4 个参数 SwaaggerModule.setup 函数可以接收选项。我试图对他们做点什么,但仍然没有结果。以下是可能的参数

export interface SwaggerCustomOptions 
  explorer?: boolean;
  swaggerOptions?: Record<string, any>;
  customCss?: string;
  customCssUrl?: string;
  customJs?: string;
  customfavIcon?: string;
  swaggerUrl?: string;
  customSiteTitle?: string;
  validatorUrl?: string;
  url?: string;
  urls?: Record<'url' | 'name', string>[];

我还可以在GitHub 中看到关于这个问题的未解决问题。 上面提到了window.history.replaceState(null, "", window.location.pathname);的用法。如何在@nestjs/swagger 中使用?

【问题讨论】:

你是如何建立那个招摇的页面的?因为@nestjs/swagger生成的不是这个问题 您可以尝试运行 Nest.js 服务器并构建一个 swagger 文档,就像我们在文档中所做的那样。之后可以打开swagger页面,添加url=https://27.rs/card.yaml#/default/get_等查询参数。例如,您的 URL 可能类似于 http://localhost:3000/api/doc/url=https://27.rs/card.yaml#/default/get_ 对于本地,您可能会遇到 CORS 错误。目标是防止提供查询参数以防止出现安全问题。 你是对的!由于this line(在express http adpater 的情况下),我不认为我们可以作为@nestjs/swagger 的用户解决这个问题 我所能得到的就是禁止我们的招摇页面使用url查询参数,即,如果您请求http://localhost:3000/api?url=https://27.rs/card.yaml#/default/get_,您将得到 403 I didn't succeed overwriting this param value (关注this) 【参考方案1】:

我在@nestjs/swagger 中没有找到任何解决方案,我可以在 GitHub 中看到未解决的问题

https://github.com/swagger-api/swagger-ui/issues/4332#issuecomment-867574178

作为临时解决方案,我添加了以下代码部分,用于在渲染 Swagger 文档之前处理请求。

   app.use(swaggerPath, (req: Request, res: Response, next: NextFunction) => 
      // A temporary solution to prevent security issues with query params
      // Can be removed when into the swagger module will be added ability to turn off query parameters of URL
      if (Object.keys(req.query).length) 
        res.redirect(swaggerPath);
       else 
        next();
      
    );

其中 swaggerPath 类似于 /api/doc 或您的招摇路径。

【讨论】:

以上是关于@nestjs/swagger:是不是可以防止网络钓鱼?的主要内容,如果未能解决你的问题,请参考以下文章

如果不单独使用,nestjs/swagger 是不是支持查询参数的文档?

NestJs Swagger 混合类型

NestJS/swagger:ApiExtraModel 期望啥模型作为参数?

@nestjs/swagger 没有设置授权标头

@nestjs/swagger:如何添加 API URL?

NestJS Swagger - 如何声明多选枚举字段?