JSONPを提供する側は、コールバック関数の名前を自由に指定できるようにしているのが一般的です。
例えば、「http://example.jp/weather.json?loc=tokyo&callback=ShowWeatherInfo」のように指定してやり、コールバック関数名としてShowWeatherInfoを使うなどです。
ShowWeatherInfo( {"city":"tokyo","weather":"rain"}); |
このコールバック関数の名前の部分も、攻撃者によるクロスサイトスクリプティングに利用される可能性がありますので、JSONPを提供する側では、コールバック関数の名前として使える文字を制限してやる必要があります。
例えば、「http://example.jp/weather.json?loc=tokyo&callback=%3Cscript%3Ealert(1)%3C%2Fscript%3E」のようなURLでJSONPが要求されたときに、callbackパラメータをそのまま使用したとすると、返されるJSONPは次のようなものになってしまいます。
<script>alert(1)</script>( { "city" : "tokyo", "weather" : "rain" } ); |
攻撃者がこのような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.