Meteorをいじってみると、安全でないパッケージを削除しても、クライアントはMeteor.userId関数を変更できることがわかりました。例えば、
Meteor.userId=function() {return "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"}
Meteor.default_connection.userId()
(リダイレクトされた関数)で実行できるように。これを保護するにはどうすればよいですか?
Meteorをいじってみると、安全でないパッケージを削除しても、クライアントはMeteor.userId関数を変更できることがわかりました。例えば、
Meteor.userId=function() {return "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"}
Meteor.default_connection.userId()
(リダイレクトされた関数)で実行できるように。これを保護するにはどうすればよいですか?
これは、Meteorセキュリティモデルがどのように機能するかを示しているため、すばらしい質問です。
Meteorはクライアントコードを信頼しないため、ここではセキュリティの問題はありません。
Meteorでは、サーバーのみが、各クライアントがアクセスできるデータ(Meteor.publishを参照)と、各クライアントが変更を許可されるデータ(Meteor.allowを参照)を決定します。クライアントがサーバーに対して認証を行うと、サーバーはユーザーのIDを保存します。そのクライアントがログアウトするまで、そのIDをあなたに提供しMeteor.publish
、Meteor.allow
サーバー上でとして機能しますuserId
。
Meteorは、ユーザーIDもクライアントに送信します。もちろん、ログインしているユーザーに基づいて、クライアントの動作と画面の表示を変更する必要があるためです。そして、あなたが言うように、不正なクライアントが任意に変更するのを防ぐことはできません。ユーザーIDと見なされるものを変更するJavaScriptコードのいずれか!ただし、セキュリティ上の決定を行うのはサーバーコードのみであるため、これを行ってもクライアントに新しいアクセス許可は付与されません。
セキュアパーティアプリケーションを使用してこれを試すことができます。
$ meteor create --example parties
Meteor.userId()
してユーザーのIDを取得します。Meteor.userId()
必要なIDを返す新しい関数で上書きします。これで、クライアントを偽造して、自分のユーザーだと思い込ませました。しかし、サーバーはよく知っています。画面にはまだパーティーが表示されないため、パーティーコレクションを更新してそのパーティー情報を変更することはできません。
実際、クライアントのユーザーIDを任意の値に設定するのは完全に安全です。アカウントシステムに直接アクセスして、に電話することができますMeteor.default_connection.setUserId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
。試してみると、右上のログインボタンがアニメーションになっているのがわかります。これは、クライアントがMeteor.user()
、設定したログインユーザーの電子メールアドレスを表示するために呼び出しているためです。ただし、そのユーザーとしてサーバーにログインしていないため、サーバーはそのユーザーに関する情報を公開しておらず、ただひどい目に遭うだけです。
これは非常に強力なセキュリティモデルです。 ほとんどのアプリではほとんどのコードが存在しますが、クライアントコードについて心配する必要はありません。安全なサーバーメソッドを記述し、関数を公開し、ルールを許可/拒否する限り、クライアントが何をしようとしても完全にロックダウンされます。
2つのブラウザを使用してMeteorをテストし、ローカルストレージをコピーし、Meteor.userId
各Meteor.loginToken
ブラウザ間で同じ人としてログインしました。一方からログアウトしても、もう一方で公開することができました。
私はこれが行われているほど安全ではないと思います。
これらの値をコピーしても、別のブラウザを使用している場合でも同じユーザーとして表示される場合は、まったく安全ではありません。
アップデート
振り返って...
ユーザーがログインしたときに、ユーザーのIPアドレスをログに記録できると思います。次に、ユーザーがアクセスを試み、IPアドレスが同じでない場合は、再度ログインするようにユーザーに依頼できます。