[気になる]JSONPの守り方:教科書に載らないWebアプリケーションセキュリティ(4)(3/3 ページ)
XSSにCSRFにSQLインジェクションにディレクトリトラバーサル……Webアプリケーションのプログラマが知っておくべき脆弱性はいっぱいあります。そこで本連載では、そのようなメジャーなもの“以外”も掘り下げていきます (編集部)
JSONP提供側のXSS
JSONPを提供する側は、コールバック関数の名前を自由に指定できるようにしているのが一般的です。
例えば、「http://example.jp/weather.json?loc=tokyo&callback=ShowWeatherInfo」のように指定してやり、コールバック関数名としてShowWeatherInfoを使うなどです。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このコールバック関数の名前の部分も、攻撃者によるクロスサイトスクリプティングに利用される可能性がありますので、JSONPを提供する側では、コールバック関数の名前として使える文字を制限してやる必要があります。
例えば、「http://example.jp/weather.json?loc=tokyo&callback=%3Cscript%3Ealert(1)%3C%2Fscript%3E」のようなURLでJSONPが要求されたときに、callbackパラメータをそのまま使用したとすると、返されるJSONPは次のようなものになってしまいます。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
攻撃者がこのようなURLに被害者を誘導し、被害者がこのようなJSONPをInternet Explorerで直接開いてしまうと、(Content-Typeの指定にもよりますが)JSONPすなわちJavaScriptのソースではなくHTMLと判断されてしまい、example.jp上でのクロスサイトスクリプティングが発生してしまうことがあります。
【Content-Typeに関する参考】
教科書に載らないWebアプリケーションセキュリティ(2)
[無視できない]IEのContent-Type無視
http://www.atmarkit.co.jp/fcoding/articles/webapp/02/webapp02a.html
このような問題を防ぐために、関数名として利用可能な文字として通常は半角英数字(a-zA-Z0-9)およびアンダースコア(_)程度のみを許可し、それ以外の文字がコールバック関数名に含まれていた場合にはエラーを返すなどにするといいでしょう。
手軽に使えるからこそ気にしたいセキュリティの基礎
今回はJSONPを利用する際に見落としがちな問題点をいろいろ挙げてみました。JSONPはJavaScriptから手軽に利用できる反面、直接JavaScriptのソースとして利用されるため、セキュリティ上の問題があった場合にはユーザー側に大きなダメージを与えることもあり得ます。
本稿が少しでもJSONPを提供する側、利用する側、双方の手助けとなれば幸いです。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(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の世界を体験してみよう