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>
["alert( '!!' )"]
[alert( "!!" )]