Проблемы безопасности при использовании драйвера MongoDB PHP - PullRequest
9 голосов
/ 21 января 2012

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

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

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

Так, например, при выполнении

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

$downloads->insert($download); 

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

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

  2. Кто-нибудь еще думает, что я должен знать об использовании MongoDB и PHP? Я получаю свои куки, используя JavaScript, и ищу в моей БД, используя куки. Как насчет этого?

Ответы [ 3 ]

5 голосов
/ 21 января 2012

Итак, когда я получаю 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? Я получаю свои куки, используя JavaScript, и ищу в моей БД, используя куки. Как насчет этого?

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

1 голос
/ 05 декабря 2013

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

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

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

0 голосов
/ 01 июня 2015

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

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

<?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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...