Вопрос по – Как вы защищаете клиентскую часть MongoDB API?

31

Я не хочу, чтобы только все мои пользователи могли вставлять / уничтожать данные.

Видетьэтот вопро pomber

Ваш Ответ

4   ответа
21

[ОБНОВИТЬ В настоящее время существует официальный и документированный пакет проверки подлинности, который предоставляет различные решения для защиты коллекции.

На уровне CRUD:

[Server] collection.allow (параметры) и collection.deny (параметры). Ограничивает методы записи по умолчанию для этой коллекции. Как только один из них вызывается в коллекции, все методы записи в этой коллекции ограничиваются независимо от небезопасного пакета.

И еще естьinsecure удалить полный доступ на запись с клиента.

источник : Начало работы с Auth (спасибо @ dan-dascalescu)

[СТАРЫЙ ОТВЕТ]

Похоже, что работает над Auth Package (?), Который не должен позволять пользователям получать полный контроль над БД, как сейчас. Есть также кто-то, кто предлагает существующее решение (обходной путь), определяя свои собственные мутации (методы) и делая их неудачными, если они пытаются выполнить несанкционированное действие. Я не получил это намного лучше, но я думаю, что это часто будет необходимо, так как я сомневаюсь, что пакет Auth позволит вам реализовать обычную логику аутентификации на уровне строк, но, вероятно, только в методах CRUD. Придется посмотреть, что скажут разработчики.

[РЕДАКТИРОВАТЬ] Нашел что-то, что, кажется, подтверждает мои мысли:

В настоящее время клиенту предоставляется полный доступ на запись в коллекцию. Они могут выполнять произвольные команды обновления Mongo. После того как мы создадим аутентификацию, вы сможете ограничить прямой доступ клиента к вставке, обновлению и удалению. Мы также рассматриваем валидаторы и другие ORM-подобные функции.

Источники этого ответа:

Доступ к БД на стороне клиента как на стороне сервера с метеором

https: //stackoverflow.com/questions/10100813/data-validation-and-security-in-meteor/10101516#1010151

Обновил спасибо, Дэн nrako
@ nrako: не могли бы вы обновить ответ, чтобы упомянуть Github.com / метеор / метеор / вики / Getting Started-с-Auth ? Dan Dascalescu
Также прочитайте эту ветку на Quora с ответом одного из разработчиков Meteor: Quora.com / Метеор-веб-рамка / Что-круто-о-Метеоре / ответ / ... dentarg
Спасибо за ваши мысли и ссылки! TK421
33

вот код, который должен делать то, что вы хотите:

Foo = new Meteor.Collection("foo");
...
if (Meteor.is_server) {
   Meteor.startup(function () {
       Meteor.default_server.method_handlers['/foo/insert'] = function () {};
       Meteor.default_server.method_handlers['/foo/update'] = function () {};
       Meteor.default_server.method_handlers['/foo/remove'] = function () {};
   });
}

Это отключит стандартные методы вставки / обновления / удаления. Клиенты могут попытаться вставить в базу данных, но сервер ничего не сделает, и клиент заметит и удалит локально созданный элемент, когда сервер ответит.

insert / update / remove все равно будет работать на сервере. Вам нужно создать методы с Meteor.methods, которые будут запускаться на сервере, чтобы выполнить любую запись в базу данных.

Все это изменится, когда появится ветка аутентификации. Как только это произойдет, вы сможете предоставить валидаторы для проверки и авторизации записей базы данных на сервере. Вот немного подробнее:http: //news.ycombinator.com/item ID = 3825063

Отлично, спасибо за всю эту информацию! Не могу дождаться, чтобы увидеть это зрелым. TK421
Можно ли защитить коллекцию от чтения с клиента? HansPinckaers
Не берите в голову; просто удалите автопубликацию.meteor remove autopublish HansPinckaers
Эта техника не нужна в Meteor 0.5.0 и выше. Используйтеallow а такжеdeny. debergalis
1

но я до сих пор сталкивался с этими двумя моментами

Вы можете ограничить доступ клиента к базе данных, добавив параметры вfind команда на стороне сервераpublish команда. Затем, когда клиент звонитCollection.find({}), возвращаемые результаты соответствуют тому, что на стороне сервера будет, например,Collection.find({user: this.userId}) (смотрите также Опубликовать определенную информацию для Meteor.users и дополнительную информацию для Meteor.user а такжеhttp: //docs.meteor.com/#meteor_publis)

Одна вещь, которая встроена (у меня есть метеор 0.5.9), - то, что клиент может толькоupdate элементы по идентификатору, не используя селекторы. Ошибка регистрируется в консоли на клиенте, если есть попытка, которая не соответствует.403: "Not permitted. Untrusted code may only update documents by ID." (видеть Понимание "Недопустимо. Ненадежный код может обновлять документы только по идентификатору." Ошибка метеора).

В связи с номером 2, вам нужно использоватьMeteor.methods на стороне сервера, чтобы сделать удаленные вызовы процедур доступными для клиента с помощьюMeteor.call.

9

Более краткий путь:

_.each(['collection1', 'collection2'], function(collection){
    _.each(['insert','update', 'remove'], function(method){
      Meteor.default_server.method_handlers['/' + collection + '/' + method] = function(){}
    });
});

или чтобы сделать его более идиоматическим:

расширить метеор:

_.extend(Meteor.Collection.prototype, {
  remove_client_access: function(methods){
    var self = this;
    if(!methods) methods = ['insert','update','remove'];
    if(typeof methods === 'String') methods = [methods];
    _.each(methods, function(method){
      Meteor.default_server.method_handlers[self._prefix + method] = function(){}
    });
  }
});

Звонки проще:

List.remove_client_access() // restrict all
List.remove_client_access('remove') //restrict one
List.remove_client_access(['remove','update']) //restrict more than one
Просто хотел отметить, что в этом больше нет необходимости, поскольку в версии 0.5.0 введена аутентификация. Видеть Docs.meteor.com / # accounts_api. @greg: есть ли шанс обновить свой ответ? Dan Dascalescu

Похожие вопросы