Подтвердить что ты не робот

Как защитить клиентский интерфейс MongoDB API?

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

4b9b3361

Ответ 1

[UPDATE] В настоящее время существует официальный и документированный пакет Auth, который предоставляет различные решения для защиты коллекции.

На уровне CRUD:

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

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

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


[OLD ANSWER]

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

[EDIT] Нашел то, что, кажется, подтверждает мои мысли:

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

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

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

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

Ответ 2

Пока нет документального способа сделать это, вот какой код, который должен делать то, что вы хотите:

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 по умолчанию. Клиенты могут пытаться вставить в базу данных, но сервер ничего не сделает, и клиент заметит и удалит локально созданный элемент, когда сервер ответит.

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

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

Ответ 3

Более сжатый способ:

_.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

Ответ 4

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

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