JSONP概要


JSONPを紹介する前に、まず簡単にJSONを紹介します.JSONはJavaScript Object Notationの略で、軽量で読み取り可能なテキストベースのデータ交換オープンスタンダードです.Javscriptプログラミング言語における単純なデータ構造と関連配列の表示機能に由来する.これは、データペアと単純な括弧構造のみを含む純粋なテキストであるため、JSONメッセージの伝達は多くの方法で行うことができる.
 
1.JSONP定義JSONPは英語JSON with Paddingの略であり、非公式のプロトコルである.サーバ側でscript tagsを生成してクライアントに戻り、javascript callbackの形式でサイトアクセスを実現できます.JSONPはscript tagの注入であり、serverから返されたresponseをページに追加して特定の機能を実現する.2.JSONP由来
JSONPの来由を説明するには、まずブラウザの「同源ポリシー(SOP:Same Origin Policy)」についてお話しします.簡単に言えば、ブラウザ制限スクリプトプログラムは、共有変数や転送変数など、プロトコル、ドメイン名、ポートのスクリプトとのみ対話できます.クッキーの伝達も同様の戦略に従う.これにより、複数のサーバに関連するアプリケーションの統合が困難になります.ドメイン間アクセスの問題で、AサイトのAjaxコードがBサイトのデータにアクセスできない.
ドメイン間アクセスをどのように解決しますか?ブラウザの機能を利用する必要があります.ブラウザはページ内のスクリプトプログラムがドメイン間でデータを読み取ることを許可しませんが、画像、CSS、スクリプトプログラムなどのドメイン間のリソースをHTMLで参照することを許可します.スクリプト・プログラムの参照は特殊で、ブラウザで解析された後、ローカルのスクリプト・プログラムと変わらず、すぐに解釈して実行できます.Bサイトのjsファイルのように、簡単なヒントボックス:alert(「This Victor!」).このjsをAサイトで参照すると、このスクリプトはBサイトのアプリケーションで実行され、alert情報が表示されます.局外スクリプトの参照はscript tagによって実現されるため、スクリプトプログラムはDOMによってHTMLページのすべてのラベルを制御することができ(scriptラベルの動的作成を含む)、これによって局外プログラムを呼び出してローカルリソースを変更することができる.また、タグの使用により、実行可能なJavaScript関数呼び出しまたはJSONデータをサービス側から直接返すことができる.
 
3.JSONPの原理と実装はまずクライアントにcallbackを登録し、callbackの名前をサーバに渡す.このとき、サーバー様はJSONデータになります.そしてJavaScript構文でfunctionを生成し、functionの名前は伝達されたパラメータjsonpである.その後、JSONデータを直接パラメータとしてfunctionに配置することで、js構文のドキュメントが生成され、クライアントに返されます.最後に,クライアントブラウザでscriptタグを解析し,返されたJavaScriptドキュメントを実行すると,データはパラメータとしてクライアントがあらかじめ定義したコールバック関数(動的にコールバック関数を実行)に渡される.
 
 
実はJSONPは簡単なものです.主にタグによるjavascriptドキュメントの動的解析を用いて実現した.(実はeval関数も使えます)
 
JSONP実装コード:
< script  type=" text/javascript" >       
        function  jsonpCallback(result){
             alert(result.msg);
        }       
< /script>       
< script  type=" text/javascript"   src=" http://mydomain.com/jsonService?jsonp=jsonpCallback">
< /script> 

注記:
jsonCallbackは,ドメインサーバ上のJSONデータを取得したクライアントのコールバック関数である. 
http://mydomain.com/jsonService?jsonp=jsonpCallbackドメイン間サーバJSONデータを取得するインタフェースで、パラメータはコールバック関数の名前です.次の形式で返されます.
jsonpCallback({ msg:'this  is  json  data'} )

 
4.jQueryとJSONP
1.2リリースから、jQueryはJSONPコールバックのローカルサポートを持っています.JSONPコールバックが指定されている場合は、別のドメインにあるJSONデータをロードできます.コールバックの構文はurl?callback=?.jQueryは自動的に?呼び出す生成関数名に置き換えます.
 
jQueryコールバック関数:
 
jQuery.getJSON(url+"&callback=?", function(data) {
    alert("Name: " + data.name + ", Phone: " + data.phone);
});

このため、jQueryはスクリプトを挿入するときに呼び出す必要があるウィンドウオブジェクトにグローバル関数を追加します.また、jQueryは非ドメイン間呼び出しを最適化することもできる.同じドメインにリクエストを送信すると、jQueryは通常のAjaxリクエストに変換します.
 
5.JSONPの安全問題
JavaScriptプログラムでは、コードを動的に生成する方法がいくつかあります.最も有名な関数の一つはeval()です.この関数では、任意の文字列をJavaScriptコードとして実行できます.しかし,この関数を勝手に使用することは非常に危険である.残念なことに、広く使用されているJavaScriptライブラリの中には、eval()関数が直接使用されています.JSON自体は安全で、付与や呼び出しは含まれていません.ただしJSONはJavaScriptのサブセットをベースとしているため,スクリプトコンテンツには悪意のあるコードが潜在的に含まれる.多くのJavaScriptライブラリがeval()関数を使用してJSONをJavaScriptオブジェクトに変換するため、攻撃者はこれらのライブラリに奇形のJSONオブジェクトを送信することができ、eval()関数はこれらの悪意のあるコードを実行します.JSONの使用を保護するには、RFC 4627で定義された正規表現を使用して、JSONデータにアクティブな部分が含まれていないことを確認します. 
 
JavaScriptコード:
 
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u 
\r\t]/.test( text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');

 
6.JSONPの欠陥
 
JSONPはmashupを構築する強力な技術ですが、残念なことに、ドメイン間通信のすべての需要の万霊薬ではありません.いくつかの欠陥があり、真剣に考えなければなりません.
第一に、最も重要な点でもあり、JSONP呼び出しに関するエラー処理はありません.ダイナミックスクリプトの挿入が有効な場合は、呼び出しを実行します.無効な場合は、サイレントに失敗します.失敗には何のヒントもありません.たとえば、サーバから404エラーをキャプチャすることも、リクエストをキャンセルまたは再開することもできません.しかし、しばらく待っても返事が来なければ、相手にしなくてもいいです.(将来のjQueryバージョンではJSONPリクエストを終了する機能がある場合があります).
第二に、JSONPは不信のサービスに利用されると危険です.JSONPサービスは、関数呼び出しにパッケージされたJSON応答を返し、関数呼び出しはブラウザによって実行されるため、ホストWebアプリケーションが様々な攻撃を受けやすい.JSONPサービスを利用する場合は、それがもたらす脅威を知ることが重要です.