読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

jquery-jsonでJSONを安全にパーズする。

jQueryのgetJSON()ではJSONの解析がwindow.eval()で行なわれてしまいますが、プラグインとして別途提供されているjquery-jsonを使うとJSONを安全に解析できます

  • プラグインをインポートすると、「$.evalJSON」と「$.secureEvalJSON」の2つのJSON解析APIが追加されます。
    • 「$.evalJSON」は安全性チェックなしに「window.eval()」してJSONを解析します。
    • 「$.secureEvalJSON」は安全性を事前にチェックしてから「window.eval()」します。
      • チェックでエラーになった場合は、例外をスローします。
  • なお、どちらの関数もJSON.parse」が使用可能であればそちらを優先して使用します。
    • なのでFireFox3だとどちらの関数を使っても安全な解析が可能だったりします。

以下は各解析メソッドで普通のJSONと安全でないJSONを解析してみるサンプルです。getJSON()とは連携してないので、コードがちょっと長くなるのはまぁ仕方がないかな。

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <script type="text/javascript" src="./jquery-1.3.2.js"></script>
  <script type="text/javascript" src="./jquery.json-2.2.js"></script>
  <script type="text/javascript">

    /**
     * ファイルを取得して指定された解析ロジックでパーズする。
     */
    function parse( file, parser ) {
      $.get( file, {}, function(result){
        try {
          var value = parser.parse(result);
          $("#stdout").append( parser.name + " " + file + " の読み込み完了 " + value + "<br/>" );
        } catch ( e ) {
          $("#stdout").append( parser.name + " " + file + " の読み込み失敗 " + e + "<br/>" );
        }
      });
    }
    $(function(){
      // 普通のJSONファイルと、実行されるとまずいJSONファイル
      var files = ["./basic.json","./error.json"];
      // 解析ロジック。
      // $.secureEvalJSON と $.evalJSON
      var parsers = [
        { name:"secureEvalJSON", parse: function( str ) { return $.secureEvalJSON( str ) } },
        { name:"evalJSON",       parse: function( str ) { return $.evalJSON( str ) } }
      ];
      // 解析を実行
      for ( var i=0;i<parsers.length;i++ ) {
        for ( var j=0;j<files.length;j++ ) {
          parse( files[j], parsers[i] );
        }
      }
    });
  </script>
</head>
<body>
  <div id="stdout" ><div>
</body>
</html>

basic.json :

["alert( '!!' )"]

error.json :

[alert( "!!" )]

実行結果はこちら。