JSONP を使用する際に考慮すべきセキュリティ上の問題はありますか?
4 に答える
更新: JSONP は、クロスドメイン リクエストを行うための一般的なハックです。最新のブラウザーには Cross Origin Resource Sharing があり、IE8+ には同様の XDomainRequest があります。詳細については、 http://enable-cors.org/を参照してください。
JSONP は、コールバックを使用できるようにする単なるスクリプト インクルードです。ただし、クロスサイト リクエスト フォージェリ (CSRF)に注意する必要があります。
スクリプトとサーバーを制御している限り、JSONP はスクリプト インクルードより安全ではありません。ログインしているユーザーに機密データを返す JSONP サービスがある場合を除きます。悪意のあるサイトは、(ユーザーがサイトにログインしていることを期待して) サービスに要求を送信し、データを取得できます。サービスはリクエストのリファラーをチェックできますが、フラッシュを使用してリファラーを偽装することができます (Chris Moschini に感謝)。
次のシナリオを想像してください。 - ユーザーが自分のインターネット バンキング アカウントにログインします。ユーザーのブラウザにセッション Cookie を保存します。このサイトには、ユーザーとそのアカウントに関する機密情報を含む jsonp サービスがあります。- 他のサイトはユーザーがログインしていることを知りませんが、勝手な推測をして jsonp サービスにアクセスしようとする可能性があります。ユーザーはセッション Cookie を持っているため、ブラウザーは応答を受け取り、サーバーに機密データを保存するためにサイトが ajax 投稿を行うのを止めるものは何もありません。
2012 年 6 月 28 日の更新: CSRF 攻撃から保護したい場合は、セキュリティの専門家による詳細なブログ投稿をお読みください: http://erlend.oftedal.no/blog/?blogid=130
はい、注意が必要ですが、信頼できるサービスで適切に使用すれば、比較的安全です。
私が理解しているJSONPのセキュリティ問題の要約は次のとおりです。
消費者の観点から:
- 指定した JSONP コールバックでラップされた予想される JSON ではなく、悪意のある JavaScript を返さないプロバイダーを信頼する必要があります。
- 同じことが、Google アナリティクスなどのサードパーティの JavaScript 埋め込みアドオンにも当てはまります。
- XSS 攻撃と似ているのは、サード パーティがアプリケーションで任意の JavaScript を実行できるようにすることだけですが、最初にリクエストを行うことによって、そのサード パーティを信頼することを選択する必要があります。
プロバイダーの観点から:
- クライアントの Cookie がリクエストに含まれていても、コンシューマーがあなたの管理下にある Web ページであると想定してはなりません。許可された URL のホワイトリストに対して Referer ヘッダーを確認するか、Cookie ベースの認証に依存しないでください。
- CSRF / 混乱した代理攻撃に類似しています。
双方にセキュリティの問題があります。最も深刻なのはJSONPを含むサイトです。
別のドメイン(自分で管理していない)からのを含める場合、そのドメインはいつでもスクリプトを変更できます。彼らはあなた自身のjavascriptがすることができるあなたのウェブページの文脈でjavascriptに何でもさせることができます。JSONPを使用する場合、これを回避する方法はありません。iframeを使用したクロスドメイン通信を検討する必要があります。これは、優れたEasyDXMライブラリによって最もよく行われます。
JSONPを処理するWebサービスを提供している場合は、クロスサイトリクエストフォージェリ(CSRF)から保護する必要があります。これは、Webサービスがログインしたユーザーに機密情報を返す場所です。ユーザーがサイトにログインしている場合、他のサイトはJSONPサービスへのGETリクエストを生成でき、ドメインのCookieはリクエストとともに送信されます。つまり、ログインしたユーザーを認証します。ただし、現在はリモートです。ドメインは応答を受け取り、機密データを読み取ることができます!
CSRFから保護する最善の方法は、ナンス(推測しにくい、ランダムに生成された数値)を生成し、それをセッションに保存することです。このナンスをあなたのウェブページのすべてのフォームに出力し、あなたのページのすべてのJSONPリクエストに含めます。サーバー上で、ナンスが存在し、リクエストに正しいことを確認します(GET、POSTなど)。他のドメインはこのナンスを推測できないため、Cookieがあるにもかかわらず、機密情報を取得できません。送信されています。
最後に、別の種類のセキュリティ問題があります。JSONPは、OAuthで可能な種類の、ブラウザーでのユーザー認証をサポートしていません。もちろん、サーバーに何らかのアクセストークン(OAuthなど)を取得させて使用させることもできます。ただし、完全にブラウザで認証を行う場合は、iFrameとのクロスドメイン通信を使用する必要があります。これがOAuth2.0のやり方だと思います。設定方法は次のとおりです。サイトでホストされているページは、サーバーに完全にアクセスできます。EasyDXMをロードし、それを使用してサイトに非表示のiframeを設定し、それを使用して通信するjavascriptライブラリを用意します。
JSONP は、JavaScript としてクロスドメインで取得したものを実行するだけなので、安全ではありません。
解決!解決!
できればサンドボックス化された iframe を作成し、そこに JSONP をロードします。結果をキャッチし、それを渡しますwindow.postMessage
はい、いつものように、誰かが最初にこのアイデアを思いつきました:)
ブログ投稿はもうありませんが、信用のためにここにリンクを残しておきます:
http://beebole.com/blog/general/sandbox-your-cross-domain-jsonp-to-improve-mashup-security/
edit :ウェイバックマシンリンク
iframe 通信に window.name ハックを使用していましたが、それは IE6 および 7 用でした。