故障排查GitHub issue3 分钟阅读排错/错误码

解决FastGPT中MongoDB查询参数类型校验不足的问题

在使用FastGPT的MongoDB数据库查询相关功能时,可能出现查询结果异常或服务报错的情况。具体表现为部分API接口未对传入参数做严格校验,例如GetDatasetCollectionsProps、UpdateDatasetCollectionParams、GetDatasetDataListProps…

现象

在使用FastGPT的MongoDB数据库查询相关功能时,可能出现查询结果异常或服务报错的情况。具体表现为部分API接口未对传入参数做严格校验,例如GetDatasetCollectionsPropsUpdateDatasetCollectionParamsGetDatasetDataListProps等类型定义中仅标注参数为字符串类型,但未在实际调用前验证参数合法性,导致不符合MongoDB ObjectId格式的参数被直接传入查询逻辑。

可能原因

该问题源于开发时未充分利用TypeScript的强类型特性,未对接口参数添加前置校验逻辑。具体来说,MongoDB查询代码this.collection.find({ _id:objectId(id)}).toArray()位于projects/service/src/common/mongo/index.ts文件中,其依赖的id参数来自上层API接口。这些API接口的参数可能来自前端URL参数或全局状态,但未经过合法性校验,直接将字符串参数转换为ObjectId,若参数格式不符合要求,会引发查询异常。同时,整体系统的参数校验环节存在不足,安全性有待提升。

排查步骤

  1. 定位到MongoDB查询的核心代码,路径为projects/service/src/common/mongo/index.ts,查看_id: objectId(id)语句中id参数的使用逻辑。
  2. 追溯调用该查询逻辑的上层API接口,相关接口定义在projects/app/src/web/core/dataset/api.ts文件中,例如getDatasetDetailgetDatasetCollectionDetail等。
  3. 查看对应API的参数类型定义,对比GetDatasetCollectionsPropsUpdateDatasetCollectionParamsGetDatasetDataListProps等类型的参数声明,确认仅标注了基础类型未做校验。
  4. 模拟传入不符合ObjectId格式的参数调用接口,观察是否出现异常,验证参数未被校验的问题。

解决与验证

解决该问题需要为接口参数添加合法性校验:在接收API参数后,对iddatasetIdcollectionId等涉及MongoDB查询的参数,校验其是否为合法的MongoDB ObjectId格式字符串,或至少确认参数类型符合预期。具体操作可在API接口层添加校验逻辑,拦截非法参数后返回明确的错误提示。 验证步骤如下:

  1. 修改对应API接口的代码,添加参数合法性校验逻辑。
  2. 重新编译并部署服务,使用合法参数调用接口,确认查询功能正常返回结果。
  3. 使用不符合格式的参数调用接口,确认系统会拦截非法参数并返回错误提示,不会直接传入MongoDB查询逻辑。

来源:FastGPT GitHub issue