web-dev-qa-db-ja.com

「許可されていません。信頼されていないコードはIDによってのみドキュメントを更新できます。」流星エラー

Meteor 0.5.8 では、次の変更が導入されました。

信頼されていないコードでのupdateおよびremoveコレクション関数の呼び出しで、任意のセレクターが使用されなくなった可能性があります。これらの関数をクライアントから(メソッドスタブ以外で)呼び出す場合は、単一のドキュメントIDを指定する必要があります。

したがって、クライアントコンソールからdbに任意の更新をプッシュする場合は、次のようにする必要があります。

People.update({_id:People.findOne({name:'Bob'})['_id']}, {$set:{lastName:'Johns'}});

の代わりに:

People.update({name:'Bob'}, {$set:{lastName:'Johns'}});

このセキュリティの問題は、Meteor.Collection.allowおよび.deny関数をautopublishおよびinsecureパッケージと組み合わせて設定することによって制御されると思いました。 Chrome JavaScriptコンソールからdbを操作できることが好きでした。

Meteor 0.5.8の変更の動機は何ですか?

31
Charles Holbrow

流星のブログ から:

許可/拒否ルールの変更

0.5.8以降、イベントハンドラなどのクライアントのみのコードは、_idで指定された一度に1つのドキュメントのみを更新または削除できます。メソッドコードは、任意のMongoセレクターを使用して、一度に任意の数のドキュメントを操作できます。イベントハンドラーから複雑な更新を実行するには、Meteor.methodsでメソッドを定義し、イベントハンドラーから呼び出すだけです。

この変更により、許可/拒否APIが大幅に簡素化され、より良いアプリケーション構造が奨励され、攻撃者がサーバーに多くの作業を強制して操作が承認されているかどうかを判断し、@によって報告されたセキュリティ問題を修正する潜在的なDoS攻撃が回避されますjan-glx。

コードを更新するには、許可ハンドラと拒否ハンドラを変更して、ドキュメントの配列ではなく単一のドキュメントを取得します。これにより、コードが大幅に簡略化されます。また、Mongoセレクターを使用するイベントハンドラーで更新または削除の呼び出しがあるかどうかを確認し(これは非常にまれです)、ある場合はそれらをメソッドに移動します。詳細については、 pdate および remove のドキュメントを参照してください。

したがって、基本的に、私の観点からは、特定の知識(ドキュメントのIDなど)がなければ、クライアントから任意のドキュメントのセットを更新および削除できるようにする動作はほとんど望めません。

プロトタイピング(あなたがやっていることではないかと思います)の場合、それが邪魔になる可能性があると思いますが、コードを本番環境に入れたい場合は、長所が短所を上回ると思います。これは、セキュリティ宣言(allowおよびdeny)にも影響し、この変更後に指定しやすくなります。

より多くの情報が得られたことを願っています。

28
lbergnehr