1

私のアプリケーションのユーザーが自分のWebサイトにコードを配置し、jsonpリクエストを介してサーバーと最小限に対話できるようにしたいと思います。ただし、私が特に許可しているリモートサイトからのみリモートリクエストを送信できるようにしたいのです。基本的に、ユーザーは私のアプリケーションのアカウントを持っている必要があります。

セキュリティのために、私の計画は次のとおりです。

  1. ドメインを保存するために、リクエストは、サイトにコードを配置することが許可される前に送信されます。
  2. サーバーはリモートリクエストを受信すると、リクエストからドメイン名を取得し、データベースと照合します。
  3. ドメインが一致する場合、リクエストは検証され、データなどとともに返されます。異なる場合は、ある種のXSS攻撃を想定してリクエストを拒否し、リモートにエラーを返します。

リクエストの送信元のドメインを取得するにはどうすればよいですか?開発ボックスでテストするために、別のポートで実行される別の静的Webサイトをセットアップしました

Server domain: localhost:8090
Remote domain: localhost:8095

getRemoteHostを使用すると、127.0.0.1が返されるようです。実際の状況では、これはリモートドメインのIPであり、そのIPから人間が読める形式のドメイン名を見つけることは可能ですか?私のサービスに接続しようとしているリモートサイトが動的IPから提供されているかどうかわからないため、IPを保存して照合することはおそらく良い考えではありません...

たぶん私はここで間違ったアプローチを取っているので、私が間違っている場合は私を訂正してください。リモートサイトのユーザーは実際のアカウントを持っていないため、ユーザー名とパスワードを要求することはできません。

おそらく、ドメインではなく、ある種の暗号化されたトークンをデータベースに保存するのがより良い方法です。ユーザーにサイトに配置するコードスニペットを与えると、この暗号化されたバージョンを含む非表示の入力が含まれる可能性があります。各リクエストで渡されるトークン?ただし、この場合、ページソースを表示して非表示の要素をコピーし、サーバーに同じようにアクセスできる人はいないでしょうか。

4

1 に答える 1

3

一方では、「特に許可したリモートサイトからのリモートリクエストのみを送信できるようにしたい」と言いますが、JSONPを使用すると、リモートサイトからのリクエストは表示されなくなります。リクエストは表示されます。リモートサイトにアクセスしたブラウザから。この区別は微妙ですが重要です。オプションが大幅に制限されるためです。

どのサイトがJSONPリクエストを発信したかを知りたい場合は、Refererヘッダーを確認できます。ただし、特にHTTP / HTTPS遷移全体で、設定されていることを信頼することはできません。次に、「ねえ、私はCORSを使用します」と思うかもしれませんが、もちろん、誰でも好きなヘッダーを使用してリクエストを作成できます。リモートサイトの1つであると主張するHTTPクライアントを作成し、それらの資格情報を使用してインターフェイスにアクセスすることができます。したがって、ヘッダーがアクセスを制限する唯一の方法である場合は、すぐに無効になることを知っておいてください。

リファラーヘッダーの上の次のステップは、トークンを発行し、それらを識別に使用することです。ただし、ご指摘のとおり、ブラウザがリクエストを作成するには、リモートサイトがこれをブラウザに提供する必要があります。したがって、誰かがそれをコピーして、どこでも使用することができます。同じ問題に戻ります。

次にできることは、共有シークレット(承認用)とともにトークン(識別用)を発行することです。次に、リモートサイトに共有シークレットを使用してリクエストに署名するように要求できます。「はい、実際には私です。リモートサイトです」と言います。このようにして、リモートサイトはユーザーのブラウザに署名を与えますが、秘密自体は与えません。署名するものがリモートサイトの意図(つまり、サイトがユーザーのブラウザに実行させたいアクション)を検証するのに十分であることを確認する必要があります。また、リプレイ攻撃を防ぐためにタイムスタンプを含める必要があります。これには、リモートサイトからのサーバー側の計算が必要ですが、リモートサイトで明示的に許可されている以外のアクションをユーザーが実行できなくなります。

ただし...これらのリモートサイトのユーザーはアカウントを持っていないということです。これが一般に公開されていることを意味する場合、誰でもこれらのリモートサイトのいずれかを取得し、署名を引き出し、それを使用してリモートサイトのユーザーが実行できるのと同じことを実行できます。これは実装の問題ではなく、アーキテクチャの問題です。設計では、ランダムなWebブラウザーがサービスと対話する必要があり、中間者を防ぐ方法はありません。共有シークレットを使用すると、ある程度の制御が可能になりますが、それを止めることはできません。

この時点で、一歩下がって、実際に解決しようとしている問題を検討することをお勧めします。このインターフェースは何をしますか?これらのリモートサイトのブラウザは、直接あなたとやり取りする必要がありますか?誰を締め出そうとしているのですか、そしてその理由は何ですか?とにかく彼らがあなたの小切手を迂回するとどうなりますか?

于 2012-09-22T16:07:00.040 に答える