2012-11-11 9 views
22

Meteorで遊んでいるので、私は、安全でないパッケージを削除しても、Meteor.userId関数を変更できることを発見しました。例えば、Meteor.userIdは変更可能

Meteor.userId=function() {return "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"} 

Meteor.default_connection.userId()(リダイレクトされた機能)と同様に行うことができます。これをどのようにして保護しますか?

答えて

65

メテオのセキュリティモデルの仕組みを示しているので、これは大きな疑問です。

Meteor は決してがクライアントコードを信頼するため、セキュリティ上の問題はありません。

Meteorでは、各クライアントがアクセスできるデータ(Meteor.publishを参照)と、各クライアントがどのデータを変更することができるかをサーバーが決定します(Meteor.allow参照)。クライアントがサーバーに対して認証すると、サーバーはユーザーのIDを保管します。そのクライアントがログアウトするまで、サーバ上のMeteor.publishおよびMeteor.allow機能にそのIDをuserIdとして提供します。

Meteorはもちろん、クライアントがどのように振る舞い、誰がログインしているかに基づいて画面上のものを変更したいので、ユーザーIDをクライアントに送信します。そして、あなたが言うように、クライアントが任意のJavaScriptコードを変更して、ユーザーIDと思われるものを変更することはありません。しかし、これを行うことでクライアントに新しい権限が与えられるわけではありません。セキュリティの決定を下すのはサーバーコードだけなので、クライアントには新しい権限が与えられません。

あなたは安全なパーティアプリケーションを使用して、これを試してみることができます。

  1. がパーティーを作成するために、地図上のユーザーアカウントをダブルクリックを作成$ meteor create --example parties
  2. 当事者アプリを作成します。チェックボックスをオンにしてプライベートパーティにします。
  3. JavaScriptコンソールを開き、Meteor.userId()と入力してユーザーのIDを取得します。
  4. ログアウト。サーバーは他のユーザーに公開しないため、パーティーは画面から消えます。
  5. これで、コンソールに入り、Meteor.userId()に新しいIDを返す関数を上書きします。

だから今、あなたはそれがあなたのユーザーだと思うようにクライアントを偽造しました。しかし、サーバーはよく分かっています。画面にパーティーはまだありません。そのパーティー情報を変更するためにパーティーコレクションを更新することはできません。

実際、クライアントのユーザーIDを必要なものに設定することは完全に安全です!アカウントシステムに直接アクセスし、Meteor.default_connection.setUserId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");に電話することができます。試してみると、右上隅のログインボタンがアニメーションに変わることがわかります。これは、クライアントがMeteor.user()に電話して、設定したばかりのログインしたユーザーのメールアドレスを表示するためです。しかし、あなたはそのユーザーとしてサーバーにログインしていないので、そのユーザーに関する情報は公開されておらず、あなたはスピンを取得するだけです。

これは非常に強力なセキュリティモデルです。ほとんどのコードが存在するほとんどのアプリでは、クライアントコードを心配する必要はありません!安全なサーバーメソッドを記述し、関数を公開し、ルールを許可/拒否する限り、クライアントが何をしようとしても完全にロックダウンされます。

2

2つのブラウザを使ってMeteorをテストしたところ、それぞれのブラウザ間にローカルストレージMeteor.userIdMeteor.loginTokenがコピーされ、両方が同じ人物としてログインしました。私が1つからログアウトしたとき、私はまだ他の人に公開することができました。

私はこれが作られているほど安全ではないと思います。

これらの値をコピーしても、同じユーザーであると見なすことができます。別のブラウザを使用している場合でも、セキュリティは完全には保護されません。


更新

反射たら...

私は彼らがログインしたとき、利用者のIP addressをログに記録することが可能であると仮定します。その後、ユーザーがアクセスしようとすると、IPアドレスが同じでない場合は、再度ログインするように要求することができます。

+1

「loginToken」は、対応するアカウントの「王国への鍵」を表します(トークンの存続期間は、デフォルトで90日です)。そのため、トークンを保護することが重要です。なぜなら、漏洩した場合、誰もそのサーバー/アカウントへのDDP接続を認証できるからです([ddp-login](https://www.npmjs.org/package/ddp-login)npmパッケージ、 例えば)。 – vsivsi

+0

だから基本的に、あなたのログインIDとトークンをコピーするためにあなたのコンピュータに誰かが物理的にアクセスしている場合、*すべての賭けがオフになっているということです。これについて実際に何をすることができますか?これはあなたのコンピュータがあればあなたのsshキーをコピーしている人と同じくらい安全ではありませんが、SSHは本当に安全であると考えられています...だからあなたのコンピュータを暗号化してください。 :) – trusktr

関連する問題