Если вы передаете параметры $_GET (или $_POST) в запросах, убедитесь, что они сначала приводятся к строкам. Пользователи могут вставлять ассоциативные массивы в запросы GET и POST, которые затем могут стать нежелательными $-запросами.
Довольно безобидный пример. Предположим, вы ищете информацию о пользователе по запросу http://www.example.com?username=bob. Ваше приложение выполняет запрос $collection->find(array("username" => $_GET['username'])).
Кто-то может сломать это, сделав запрос http://www.example.com?username[$ne]=foo, который PHP волшебным образом превратит в ассоциативный массив, превратив его в $collection->find(array("username" => array('$ne' => "foo"))), который вернет всех пользователей, не имеющих имени "foo" (вероятно, всех ваших пользователей).
От такой атаки довольно легко защититься: убедитесь, что параметры $_GET и $_POST соответствуют ожидаемому типу, прежде чем отправлять их в базу данных (в данном примере приведите их к строкам).
Обратите внимание, что этот тип атаки может использоваться с любым взаимодействием с базой данных: включая поиск, изменение и удаление.
Спасибо » Филу за указание на это.
Смотрите » основную документацию для получения дополнительной информации об SQL-инъекциях в MongoDB.
Если вы используете JavaScript, убедитесь, что все переменные, которые пересекают границы PHP-JavaScript, передаются в поле scope класса MongoCode, а не интерполируются в строку JavaScript. Это может произойти при использовании MongoDB::execute(), $where сlauses, MapReduces, group-by и в любых других случаях, когда вы можете передать JavaScript в базу данных.
Замечание:
MapReduce игнорирует поле scope класса MongoCode, но в команде есть параметр scope, который можно использовать вместо него.
Например, предположим, что у нас есть некоторый JavaScript, чтобы приветствовать пользователя в журналах базы данных. Мы могли бы сделать:
<?php
// не делайте так!
$username = $_POST['username'];
$db->execute("print('Привет, $username!');");
?>
Что будет, если злоумышленник передаст какой-то JavaScript?
<?php
// не делайте так!
// в $username будет передано "'); db.users.drop(); print('"
$db->execute("print('Привет, $username!');");
?>
Теперь MongoDB выполняет строку JavaScript "print('Привет, '); db.users.drop(); print('!');". Эту атаку легко предотвратить: используйте scope для передачи переменных из PHP в JavaScript:
<?php
$scope = array("user" => $username);
$db->execute(new MongoCode("print('Привет, '+user+'!');", $scope));
?>
Это добавит переменную user в область JavaScript. Теперь, если кто-то попытается отправить вредоносный код, MongoDB безвредно напечатает Привет, '); db.dropDatabase(); print('!.
Использование scope помогает предотвратить выполнение вредоносного ввода базой данных. Тем не менее, вы должны убедиться, что ваш код не изменится и все равно выполнит ввод! Например, никогда не используйте функцию JavaScript eval при вводе пользователем данных:
<?php
// не делайте так!
// $jsShellInput is "db.users.drop();"
$scope = array("input" => $jsShellInput);
$db->execute(new MongoCode("eval(input);", $scope));
?>
Всегда используйте scope и никогда не позволяйте базе данных выполнять пользовательский ввод в виде кода.