如果您正在将$_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 注入问题的的信息。