【发布时间】: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(在
expresshttp 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)
标签: node.js swagger nestjs swagger-ui nestjs-swagger