[5] JSONP は、JSON を JavaScript の関数の呼び出しの引数として記述する (関数名と括弧で括る) ことによって異なる起源に要求を送信し、 応答を受信する技法です。
[6] CORS が実装される前に同一起源ポリシーの抜け道として広く Webアプリケーションによって利用されていました。 セキュリティーホールの温床であることもあり、現在ではあまり使われず、 CORS を利用するのが一般的となっています。
[34] JSONP はほぼセキュリティーホールであり、望ましくないと考えられています。
[39] 元々公開されていて漏洩してもまったく問題のないデータならセキュリティー問題にはなりませんが、 古い時代の裏技的な手法ですから、今時敢えて使うメリットはまったくありません。 問題があるかないか微妙な場合に判断を誤るリスクを考えると、 避けておくのが無難でしょう。
[40] Webブラウザー上で異なる起源のデータを取得するには、 Fetch API を使うことができます。 Fetch API に対応していない Webブラウザーを想定するなら、 XHR を使うことができます。
[35] JavaScript としても解釈可能な JSON データを JavaScript 関数呼び出しの形で表現したものと理解されています (が、 正式な規定はなく、厳密な定義は不明です)。
callback
引数[10] JavaScript の関数名は、 URL の query 部
(application/x-www-form-urlencoded
) の
callback
引数によって指定されたものを使うことが慣例となっています。
[11] JSONP は通常は (その用途からしても) GET
で使うものですが、 POST
でも要求を受け付けている場合、
要求メッセージのメッセージ本体の application/x-www-form-urlencoded
や multipart/form-data
の callback
引数でも指定を受け付けることがあります。
[12] 関数名として任意の文字列を受け付けると、任意の JavaScript コードの注入を許してしまうことになり、脆弱性となります。 JSONP の生成者は関数名として使える文字を限定し、 使えない文字が含まれているとエラーの応答を返したり、 既定の関数名で返したりする必要があります。実装によっては通常の JSON を返すかもしれません。
[13] callback
引数やそれに相当する指定がない場合の動作は実装により異なります。
通常の JSON で返すことやエラーの応答を返すこともあれば、既定の関数名で返すこともあります。
[14] JSON と JavaScript のオブジェクトリテラルは、
厳密には構文的に違いがあります。
[45] ですからただ単に JSON の前後に関数名と括弧を連結するだけでは、 正しい JavaScript コードとならず、構文エラーになる可能性があります。
[15] これを避けるためには、 JSON の生成時、または JSON から JSONP への変換時にいくつかの文字をエスケープしなければなりません。 しかしそれをしていない実装もあり、ある種の脆弱性となるかもしれません。
[7] JSONP は JavaScript のコードですから、 text/javascript
が適切と考えられます。
[8] JSONP は JSON の変種であるとして、 application/json
が指定されることもあります。
[9] また text/html
や
text/plain
、 Content-Type:
なしなどで送信されることもあります。
[18] JSONP は異なる起源に要求を送信し、特定の処理を実行してその結果を得るために用いられることがあります。 その素朴な実装は、 CSRF 脆弱性そのものです。
[19] 特に、 JSONP では特定の URL の GET
だけで処理を実行させられますから、
JavaScript の記述や実行が認められていなくても、 img
要素の src
属性に指定するなどより簡易な方法で呼び出せてしまいますので、
より深刻な問題となる可能性があります。
[21] JSONP は、2005年12月5日に Bob Ippolito がブログで提案 >>4 しました。呼称の由来は「JSON with Padding」>>4 だといいます。
[23] なお query引数の名前は jsonp
>>4 とされていました。
後に普及することになる callback
はまだ使われていませんでした。
[24] JSONP はデファクト標準であり、仕様書と呼べるものは存在していません。
[25] 個別の Web API の実装仕様の類を除けば、 JSONP を採用している仕様には次のものがあります。
[43] JSONP Sandboxを使ったXSS - 金利0無利息キャッシング – キャッシングできます - subtech () https://subtech.g.hatena.ne.jp/mala/20140120/1390227002
.
を、 配列内の関数を呼び出すために[
や]
を認めることもあります。