FastGPT icon indicating copy to clipboard operation
FastGPT copied to clipboard

mongo查询问题

Open 503612012 opened this issue 10 months ago • 7 comments

const apps = await MongoApp.find({aaa: {$eq: 'bbb'}});

发现这种查询,任意写key和value,都能将库中所有数据查询出来,是框架的bug吗?有没有办法解决?

503612012 avatar Feb 11 '25 05:02 503612012

mongoose 会过滤掉未声明的字段。aaa 这个字段没在 schema 里声明,相当于无效。

c121914yu avatar Feb 11 '25 06:02 c121914yu

mongoose 会过滤掉未声明的字段。aaa 这个字段没在 schema 里声明,相当于无效。

那这样会不会很危险?万一某个字段写错了,name字段是存在的,不小心写成namee

MongoApp.deleteMany({namee: {$eq: 'bbb'}});

会不会把所有数据都删除了?

503612012 avatar Feb 11 '25 07:02 503612012

mongoose 会过滤掉未声明的字段。aaa 这个字段没在 schema 里声明,相当于无效。

那这样会不会很危险?万一某个字段写错了,name字段是存在的,不小心写成namee

MongoApp.deleteMany({namee: {$eq: 'bbb'}}); 会不会把所有数据都删除了?

这个会的,所以数据库操作得注意~ 缺少是个隐患,后续我们看看 mongoose 有没有想过优化功能。cc @FinleyGe

c121914yu avatar Feb 11 '25 07:02 c121914yu

mongoose 会过滤掉未声明的字段。aaa 这个字段没在 schema 里声明,相当于无效。

那这样会不会很危险?万一某个字段写错了,name字段是存在的,不小心写成namee

MongoApp.deleteMany({namee: {$eq: 'bbb'}}); 会不会把所有数据都删除了?

这个会的,所以数据库操作得注意~ 缺少是个隐患,后续我们看看 mongoose 有没有想过优化功能。cc @FinleyGe

这种其实应该过不了 ts 的编译(?) 有个想法是加个中间件,对所有的query进行处理,与上一个 exist: true 的条件,应该能彻底避免这些问题

FinleyGe avatar Feb 11 '25 14:02 FinleyGe

mongoose 会过滤掉未声明的字段。aaa 这个字段没在 schema 里声明,相当于无效。

那这样会不会很危险?万一某个字段写错了,name字段是存在的,不小心写成namee了 MongoApp.deleteMany({namee: {$eq: 'bbb'}}); 会不会把所有数据都删除了?

这个会的,所以数据库操作得注意~ 缺少是个隐患,后续我们看看 mongoose 有没有想过优化功能。cc @FinleyGe

这种其实应该过不了 ts 的编译(?) 有个想法是加个中间件,对所有的query进行处理,与上一个 exist: true 的条件,应该能彻底避免这些问题

应该是mongose框架的问题吧,您可以测试一下,加上exist: true也是不生效的,同样会静默忽略这个不存在的属性。目前来说,测试使用find类的查询,都会静默忽略不存在的属性,exist、strict都不起作用,只有使用aggregate查询时,才可以(但使用find查询的场景太多了,觉得有必要修复下),以下是测试场景:

// 以下均会静默忽略不存在的属性,查询出了所有的数据
const apps1 = await MongoApp.find({aaa: { $exists: true }, aaa: {$eq: 'bbb'}});
const apps2 = await MongoApp.find({aaa: { $exists: false }, aaa: {$eq: 'bbb'}});

const apps3 = await MongoApp.find({aaa: {$eq: 'bbb'}});

const apps4 = await MongoApp.find({aaa: {$eq: 'bbb', $exists: true}});
const apps5 = await MongoApp.find({aaa: {$eq: 'bbb', $exists: false}});

const apps6 = await MongoApp.find({aaa: {$eq: 'bbb'}}).setOptions({strict: false});
const apps7 = await MongoApp.find({aaa: {$eq: 'bbb'}}).setOptions({strict: true});

const apps8 = await MongoApp.find({aaa: 'bbb'});
const apps9 = await MongoApp.find({aaa: 'bbb'}).setOptions({strict: false});
const apps10 = await MongoApp.find({aaa: 'bbb'}).setOptions({strict: true});

const apps11 = await MongoApp.find({ aaa: { $eq: 'bbb', $exists: true } }).where('aaa').exists(true);

// 以下使用聚合,exists起作用了,没有查询到数据
const apps12 = await MongoApp.aggregate([
  { $match: { aaa: 'bbb' } },
  { $match: { aaa: { $exists: true } } }
]);

503612012 avatar Feb 17 '25 02:02 503612012

mongoose 确实有坑。。aggregate 应该没经过 mongoose 处理直接丢给 mongo 去执行的。。所以没问题

FinleyGe avatar Feb 17 '25 09:02 FinleyGe

https://www.securityweek.com/vulnerabilities-in-mongodb-library-allow-rce-on-node-js-servers/ mongose的漏洞

503612012 avatar Feb 24 '25 00:02 503612012