Проблемы безопасности при использовании драйвера PHP MongoDB

У меня есть опыт в обеспечении SQL-инъекций на MYSQL, но что я должен делать осторожным в MongoDB, используя php-драйвер? На большинстве страниц я получаю данные через GET / POST и поиск / вставку системы. Я ищу через UDID / другие поля и могу вставить любое строковое значение. Также я получаю файлы cookie пользователя через javascript.

  1. Итак, когда GET / POST, я добавляю к каждой переменной htmlentities функцию?

  2. Что заменит mysql_real_escape_string? Должен ли я использовать его?

Так, например, когда

$download = array( 'url' => $_GET['url'] ); $downloads->insert($download); 

Это нормально?

  1. Есть ли способ проверить, действительно ли строка является UID?

  2. Любые думают еще, что я должен знать при использовании MongoDB и PHP? Я получаю свои файлы cookie с помощью javascript и выполняю поиск в своей БД с помощью файлов cookie. Что об этом?

Итак, когда GET / POST, я добавляю к каждой переменной htmlentities функцию?

Не нужно. Однако вы должны использовать htmlentities при выводе пользовательских данных в браузер, чтобы предотвратить атаки XSS.

Что заменит mysql_real_escape_string? Должен ли я использовать его?

Вы не должны использовать mysql_real_escape_string как и для MySQL. Ничто не заменяет это на MongoDB, драйвер заботится о том, чтобы избежать данных для вас.

Есть ли способ проверить, действительно ли строка является UID?

Единственный способ проверить это – запросить MongoDB с этой строкой и проверить, существует ли она.

Однако вы можете проверить правильность формата :

 $id = '4f1b166d4931b15415000000'; $a = new MongoId($id); var_dump($a->{'$id'} == $id); // true $id = 'foo'; $a = new MongoId($id); var_dump($a->{'$id'} == $id); // false 

Любые думают еще, что я должен знать при использовании MongoDB и PHP? Я получаю свои файлы cookie с помощью javascript и выполняю поиск в своей БД с помощью файлов cookie. Что об этом?

Немного. Что касается любого веб-приложения, вам очень не рекомендуется хранить конфиденциальные данные в файлах cookie, таких как идентификаторы пользователей, пароли и т. Д., Так как их можно легко отгладить и использовать для доступа к частям вашего приложения, которые должны быть ограничены, или выдавать себя за других пользователей ,

Кстати, я думаю, что что-то пропустили, например

  yourdomain.com/login?username=admin&passwd[$ne]=1 

В Sql это выглядит так:

  SELECT * FROM collection WHERE username="admin", AND passwd!=1 

Я знаю, что это оправдано, чтобы избежать этих ограничений, чтобы узнать, какой тип данных вы ожидаете, и бросить его. Надеюсь, что ответ был полезен

Да, вам нужно бежать!

Представьте себе такой код:

 <?php $login = $users->findOne( [ 'user_id' => $_GET['uid'], 'password' => $_GET['password'] ] ); ?> 

И запрос:

 https://example.com/login?uid=3&password[$neq]=xxx 

Это приведет к регистрации!
Вы должны преобразовать значения GET / POST в строку.
Нет необходимости скрывать цитаты и т. Д.

В вашем случае, чтобы предотвратить массивы как «url»:

 $download = array( 'url' => (string)$_GET['url'] ); $downloads->insert($download);