事实上,使用 Mongo 执行注入是可能的。我的经验是在 Ruby 中,但请考虑以下几点:
Request: /foo?id=1234
id = query_param["id"]
collection.find({_id: id})
# collection.find({_id: 1234})
看起来很无害,对吧?但是,根据您的 HTTP 库,您最终可能会将某些查询字符串解析为数据结构:
Request: /foo?id[$gt]=0
# query_param["id"] => {"$gt": 0}
collection.find({_id: id})
# collection.find({_id: {"$gt": 0}})
这在强类型语言中可能不太危险,但仍然需要提防。
这里的典型补救措施是确保您始终将入站参数数据转换为您期望的类型,并在您不匹配类型时严重失败。这适用于 cookie 数据以及来自不受信任来源的任何其他数据;激进的强制转换将防止聪明的用户通过传入运算符哈希而不是值来修改您的查询。
MongoDB 文档同样说:
MongoDB 查询语言中的字段名称具有语义含义。美元符号(即 $)是用于表示运算符(即 $inc)的保留字符。因此,您应该确保应用程序的用户不能将运算符注入到他们的输入中。
您还可以从这个答案中获得一些价值。