我必须错过一些令人眼花缭乱的事情。有人请羞辱我;
我正在构建2.2聚合查询,C#Linq驱动程序本身不支持这些查询,因此我必须使用点分表示法为嵌套属性构建字符串化名称。说我有这样的结构;
db.so.insert({
a:1,
b:2,
n : {
z:4,
x:5,
y: {
v:"value",
}
}
});
因此,要引用“值”,我需要使用名称n.y.v
或n[y][v]
。现在,因为我从Web客户端(http://www.demo.org/exampleQuery?field1=n&field2=y&field3=v
)接收查询的字段属性名称,所以我需要构造属性名称;
var fieldNameForQuery = field1+"."+field2+"."+field3;
我显然对此感到紧张,所以当然我通过清理输入参数来防御NOSQL注入,但我更倾向于使用C#驱动程序代替。
我想我喜欢这样的东西;
MongoDB.Driver.BuildNestedFieldName(field1, field2, field3));
这基本上就是我自己编写的内容,但感觉就像一个kludge,我宁愿不保持以这种方式构建数据库安全字段名称的责任。
答案 0 :(得分:0)
目前还没有能够做你想要的功能。但是,如果所有的功能都是“。”在中间,那么我们就没有解决注入问题,因为我们插入的东西不能被注入......注入问题可以通过确保来解决“field1”,“field2”和“field3”是字段名称的有效值。当然,根据http://bsonspec.org/#/specification,没有多少是无效的。我们唯一要检查的是字符串中没有2个空终止符。所以...这并没有给我们留下太多我们能做的事情。
这有意义吗?