web-dev-qa-db-ja.com

クライアント側のMongoDBAPIをどのように保護しますか?

すべてのユーザーがデータを挿入/破棄できるようにしたくありません。

31
TK421

[UPDATE]コレクションを保護するためのさまざまなソリューションを提供する公式の文書化された認証パッケージがあります。

CRUDレベル:

[サーバー] collection.allow(options)およびcollection.deny(options)。このコレクションのデフォルトの書き込みメソッドを制限します。これらのいずれかがコレクションで呼び出されると、そのコレクションのすべての書き込みメソッドは、安全でないパッケージに関係なく制限されます。

また、クライアントから完全な書き込みアクセスを削除するためのinsecureもあります。

ソース: Auth入門 (@ dan-dascalescuに感謝)


[古い答え]

どうやら、現在のようにユーザーがデータベースを完全に制御することを回避する認証パッケージ(?)に取り組んでいるようです。また、独自のミューテーション(メソッド)を定義し、不正なアクションを実行しようとすると失敗するようにすることで、既存の解決策(回避策)があることを示唆する人もいます。私はそれをあまり良くしませんでしたが、Auth Packageが通常の認証ロジックを行レベルで実装できるとは思えないので、これはしばしば必要になると思いますが、おそらくCRUDメソッドでのみです。開発者が何を言わなければならないかを見なければならないでしょう。

[編集]私の考えを確認しているように見える何かを見つけました:

現在、クライアントにはコレクションへの完全な書き込みアクセス権が付与されています。任意のMongo更新コマンドを実行できます。認証を構築すると、挿入、更新、削除へのクライアントの直接アクセスを制限できるようになります。バリデーターやその他のORMのような機能も検討しています。

この答えの出典:

meteorを使用したサーバー側のようにクライアント側でDBにアクセスする

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

21
nrako

これを行うための文書化された方法はまだありませんが、ここにあなたが望むことをするべきいくつかのコードがあります:

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 () {};
   });
}

これにより、デフォルトの挿入/更新/削除メソッドが無効になります。クライアントはデータベースへの挿入を試みることができますが、サーバーは何もせず、サーバーが応答すると、クライアントはローカルで作成されたアイテムに気づき、削除します。

挿入/更新/削除は引き続きサーバー上で機能します。データベースへの書き込みを実行するには、サーバー上で実行されるMeteor.methodsを使用してメソッドを作成する必要があります。

認証ブランチが到着すると、これらすべてが変更されます。それが発生すると、サーバーへのデータベース書き込みを検査および承認するためのバリデーターを提供できるようになります。ここにもう少し詳細があります: http://news.ycombinator.com/item?id=382506

33
n1mmy

より簡潔な方法:

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

Meteorは初めてですが、これまでに出会ったのはこの2つのポイントです。

  1. サーバー側のfindコマンドのpublishコマンドにパラメーターを追加することにより、クライアントがデータベースでアクセスできるものを制限できます。次に、クライアントがCollection.find({})を呼び出すと、返される結果は、サーバー側の結果に対応します。たとえば、Collection.find({user: this.userId})Meteorの特定の情報を公開するも参照) .usersおよびMeteor.userの詳細情報 および http://docs.meteor.com/#meteor_publish

  2. 組み込まれていることの1つ(私はmeteor 0.5.9を持っています)は、クライアントがセレクターを使用せずに、IDでupdateアイテムのみを実行できることです。準拠しない試みがあった場合、エラーがクライアントのコンソールに記録されます。 403: "Not permitted. Untrusted code may only update documents by ID."「許可されていません。信頼できないコードはIDでのみドキュメントを更新できます。」Meteorエラーを理解してください を参照してください。

番号2を考慮すると、サーバー側でMeteor.methodsを使用して、Meteor.callを使用してクライアントがリモートプロシージャコールを利用できるようにする必要があります。

1
scottgwald