如果您将 $_GET
(或 $_POST
)参数传递给您的查询,请确保首先将它们强制转换为字符串。用户可以在 GET 和 POST 请求中插入关联数组,这可能会变成不想要的 $-查询。
一个相当无害的例子:假设您正在使用请求 http://www.example.com?username=bob 查找用户信息。您的应用程序创建查询 $q = new \MongoDB\Driver\Query( [ 'username' => $_GET['username'] ])
。
有人可以通过获取 http://www.example.com?username[$ne]=foo 来破坏这一点,PHP 会将其神奇地转换为关联数组,将您的查询变为 $q = new \MongoDB\Driver\Query( [ 'username' => [ '$ne' => 'foo' ] ] )
,这将返回所有未命名为“foo”的用户(可能是您的所有用户)。
这是一种相当容易防御的攻击:在将 $_GET 和 $_POST 参数发送到数据库之前,请确保它们是您期望的类型。PHP 有 filter_var() 函数来帮助您完成此操作。
请注意,这种类型的攻击可用于任何定位文档的数据库交互,包括更新、插入更新、删除和 findAndModify 命令。
有关 MongoDB 中类似 SQL 注入问题的更多信息,请参阅 » 主文档。