Request Injection Attacks
If you are passing $_GET
(or $_POST
)
parameters to your queries, make sure that they are cast to strings first.
Users can insert associative arrays in GET and POST requests, which could
then become unwanted $-queries.
A fairly innocuous example: suppose you are looking up a user's information
with the request http://www.example.com?username=bob.
Your application creates the query
$q = new \MongoDB\Driver\Query( [ 'username' => $_GET['username'] ])
.
Someone could subvert this by getting
http://www.example.com?username[$ne]=foo, which PHP
will magically turn into an associative array, turning your query into
$q = new \MongoDB\Driver\Query( [ 'username' => [ '$ne' => 'foo' ] ] )
,
which will return all users not named "foo" (all of your users, probably).
This is a fairly easy attack to defend against: make sure $_GET and $_POST parameters are the type you expect before you send them to the database. PHP has the filter_var() function to assist with this.
Note that this type of attack can be used with any database interaction that locates a document, including updates, upserts, deletes, and findAndModify commands.
See » the main documentation for more information about SQL-injection-like issues with MongoDB.