BSON
当客户端程序在 MongoDB 中组合一个查询时,它会构建一个 BSON 对象 ,而不是一个字符串。因此传统的 SQL 注入攻击并不是问题。更多细节和一些细微差别如下。
MongoDB 将查询表示为 BSON 对象。通常, 客户端驱动库 提供了一个方便,无注入的过程来构建这些对象。考虑以下 C ++ 示例:
BSONObj my_query = BSON ( “name” << a_name );
auto_ptr < DBClientCursor > cursor = c.query (“tutorial.persons” , my_query );
示例中, my_query 的值可能是例如 {name:”Joe”} 。如果包含特殊字符,例如 ,:和 { ,查询根本不会匹配上任何文档。例如,用户无法劫持查询并将其转换为删除。
JavaScript注意:
您可以通过在命令行上传递 –noscripting 选项 或在配置文件中设置 security.javascriptEnabled 来禁用 JavaScript 的所有服务器端执行功能 。
所有以下 MongoDB 操作都允许您直接在服务器上运行任意 JavaScript 表达式:
· $where
·mapReduce
· group
在这些情况下,您必须小心谨慎,以防止用户提交恶意 JavaScript 。
幸运的是,您可以在没有 JavaScript 的 MongoDB 中表达大多数查询,对于需要 JavaScript 的查询,您可以在单个查询中混合使用 JavaScript 和非 JavaScript 。将所有用户提供的字段直接放在 BSON 字段中,并将 JavaScript 代码传递给该 $where 字段。
如果需要在 $where 子句中传递用户提供的值,则可以使用 CodeWScope 机制转义这些值。当在作用域文档中将用户提交的值设置为变量时,可以避免在数据库服务器上执行它们。
收起