Уязвимы ли MongoDB? - программирование
Подтвердить что ты не робот

Уязвимы ли MongoDB?

Если вы связываете вызов api с идентификатором объекта, можно ли просто перевести его в api для получения всех объектов? Если вы думаете о MySQL, это было бы вполне возможно с инкрементными целыми идентификаторами. Но как насчет MongoDB? Являются ли ids допустимыми? Например, если вы знаете один идентификатор, легко ли угадать другие (следующие, предыдущие) идентификаторы?

Спасибо!

4b9b3361

Ответ 1

Обновление январь 2019 года. Как уже упоминалось в комментариях, информация ниже верна вплоть до версии 3.2. Версия 3. 4+ изменила спецификацию, так что идентификатор машины и идентификатор процесса были объединены в одно случайное 5-байтовое значение. Это может затруднить определение источника документа, но также упрощает генерацию и снижает вероятность коллизий.

Оригинальный ответ:

+1 для ответа Серджио, с точки зрения ответа на то, могут ли они быть угаданы или нет, они не являются хэшами, они предсказуемы, поэтому их можно "зверски форсировать" при наличии достаточного времени. Вероятность зависит от того, как были сгенерированы ObjectID и как вы угадываете. Чтобы объяснить, сначала прочитайте спецификацию здесь:

Спецификация идентификатора объекта

Давайте разберем его по частям:

  • TimeStamp - полностью предсказуемый, пока у вас есть общее представление о том, когда были сгенерированы данные
  • Машина - это хеш MD5 одного из нескольких вариантов, некоторые из которых легче определить, чем другие, но сильно зависят от среды
  • PID - опять же, не большое количество значений здесь, и может быть обработано для данных, сгенерированных из известного источника
  • Инкремент - если это случайное число, а не инкремент (оба допускаются), то оно менее предсказуемо

Чтобы немного расширить источники. ObjectID могут быть сгенерированы:

  • Сам MongoDB (но может быть перенесен, перемещен, обновлен)
  • Драйвер (на любой машине, которая вставляет или обновляет данные)
  • Ваше приложение (вы можете вручную вставить свой собственный ObjectID, если хотите)

Итак, есть вещи, которые вы можете сделать, чтобы их было сложнее угадать по отдельности, но без большого количества продуманной и надежной защиты, для нормального набора данных, диапазоны действительных идентификаторов ObjectID должны быть достаточно просты для определения, так как все они имеют префикс с timestamp (если вы не манипулируете этим каким-либо образом).

Ответ 2

Mongo ObjectId никогда не предназначался для защиты от атаки грубой силы (или любой атаки, если на то пошло). Они просто предлагают глобальную уникальность. Вы должны не предположить, что какой-либо объект не может быть доступен пользователю, потому что этот пользователь не должен знать свой идентификатор.

Для реальной защиты ваших ресурсов используйте другие методы.

Если вы защищаетесь от несанкционированного доступа, поместите в свое приложение логику авторизации (разрешите доступ к законным пользователям, откажитесь от всех остальных).

Если вы хотите помешать сбросу всех объектов, используйте ограничение скорости. Объедините с разрешением, если это применимо.

Дополнительное чтение: Эрик Липперт по GUID.