mongo查询问题
const apps = await MongoApp.find({aaa: {$eq: 'bbb'}});
发现这种查询,任意写key和value,都能将库中所有数据查询出来,是框架的bug吗?有没有办法解决?
mongoose 会过滤掉未声明的字段。aaa 这个字段没在 schema 里声明,相当于无效。
mongoose 会过滤掉未声明的字段。aaa 这个字段没在 schema 里声明,相当于无效。
那这样会不会很危险?万一某个字段写错了,name字段是存在的,不小心写成namee了
MongoApp.deleteMany({namee: {$eq: 'bbb'}});
会不会把所有数据都删除了?
mongoose 会过滤掉未声明的字段。aaa 这个字段没在 schema 里声明,相当于无效。
那这样会不会很危险?万一某个字段写错了,
name字段是存在的,不小心写成namee了MongoApp.deleteMany({namee: {$eq: 'bbb'}}); 会不会把所有数据都删除了?
这个会的,所以数据库操作得注意~ 缺少是个隐患,后续我们看看 mongoose 有没有想过优化功能。cc @FinleyGe
mongoose 会过滤掉未声明的字段。aaa 这个字段没在 schema 里声明,相当于无效。
那这样会不会很危险?万一某个字段写错了,
name字段是存在的,不小心写成namee了MongoApp.deleteMany({namee: {$eq: 'bbb'}}); 会不会把所有数据都删除了?
这个会的,所以数据库操作得注意~ 缺少是个隐患,后续我们看看 mongoose 有没有想过优化功能。cc @FinleyGe
这种其实应该过不了 ts 的编译(?) 有个想法是加个中间件,对所有的query进行处理,与上一个 exist: true 的条件,应该能彻底避免这些问题
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 } } }
]);
mongoose 确实有坑。。aggregate 应该没经过 mongoose 处理直接丢给 mongo 去执行的。。所以没问题
https://www.securityweek.com/vulnerabilities-in-mongodb-library-allow-rce-on-node-js-servers/ mongose的漏洞