现象
在使用FastGPT的MongoDB数据库查询相关功能时,可能出现查询结果异常或服务报错的情况。具体表现为部分API接口未对传入参数做严格校验,例如GetDatasetCollectionsProps、UpdateDatasetCollectionParams、GetDatasetDataListProps等类型定义中仅标注参数为字符串类型,但未在实际调用前验证参数合法性,导致不符合MongoDB ObjectId格式的参数被直接传入查询逻辑。
可能原因
该问题源于开发时未充分利用TypeScript的强类型特性,未对接口参数添加前置校验逻辑。具体来说,MongoDB查询代码this.collection.find({ _id:objectId(id)}).toArray()位于projects/service/src/common/mongo/index.ts文件中,其依赖的id参数来自上层API接口。这些API接口的参数可能来自前端URL参数或全局状态,但未经过合法性校验,直接将字符串参数转换为ObjectId,若参数格式不符合要求,会引发查询异常。同时,整体系统的参数校验环节存在不足,安全性有待提升。
排查步骤
- 定位到MongoDB查询的核心代码,路径为
projects/service/src/common/mongo/index.ts,查看_id: objectId(id)语句中id参数的使用逻辑。 - 追溯调用该查询逻辑的上层API接口,相关接口定义在
projects/app/src/web/core/dataset/api.ts文件中,例如getDatasetDetail、getDatasetCollectionDetail等。 - 查看对应API的参数类型定义,对比
GetDatasetCollectionsProps、UpdateDatasetCollectionParams、GetDatasetDataListProps等类型的参数声明,确认仅标注了基础类型未做校验。 - 模拟传入不符合ObjectId格式的参数调用接口,观察是否出现异常,验证参数未被校验的问题。
解决与验证
解决该问题需要为接口参数添加合法性校验:在接收API参数后,对id、datasetId、collectionId等涉及MongoDB查询的参数,校验其是否为合法的MongoDB ObjectId格式字符串,或至少确认参数类型符合预期。具体操作可在API接口层添加校验逻辑,拦截非法参数后返回明确的错误提示。 验证步骤如下:
- 修改对应API接口的代码,添加参数合法性校验逻辑。
- 重新编译并部署服务,使用合法参数调用接口,确认查询功能正常返回结果。
- 使用不符合格式的参数调用接口,确认系统会拦截非法参数并返回错误提示,不会直接传入MongoDB查询逻辑。