偽物のJSON記法はJSONハイジャックに弱いに違いない(当て推量)

本物のJSON記法では文法的にはJSONオブジェクトとかいうのを使っていて、これはObjectリテラルのサブセットになっているのだそうです。だから、安易にObjectリテラルを使ってJSONでございます、とかは言えないと聞きました。

本物の一例
{ "Latitude" : "37.7668" }
偽物の一例
{ Latitude : "37.7668" }
keyの部分が文字列になっていて『"』で括られているのが本物の証。偽物のほうは、識別子になっちゃっています。ずいぶんと売れたと思いますけれど、書籍『Ajax イン・アクション』あたりではこのへんがすこぶる怪しいとか聞きます。さっきこの本をながめましたけれども、見た限りでは確かに。ま、evalった結果は同じになるようにみえるので構わないではないかという説も聞くところによれば、あるらしいのです。うぅむ。でもそんなことを聞いたら、JSON記法の産みの親たるダグラス・クロックフォードさんはきっと悲しいと思います。ええと。ところで。

{
label : ステートメント
}
上のような感じで、ブロック文にラベル登場!とかいう表現と、偽物JSON記法がどこか似ていることは明らかです。あくまでも私的推察ですがクロックフォードさんはこのことを避ける為に、オブジェクトリテラルのサブセットとして本物の記法を定めた…というのも、ひとつの理由ではないかと。なお、こんなんじゃなくて、全く正統な理由をHawkさん(jsphonの作者さん)による優れた記事にまとめらていたんですけれど、今はサイトが廃止されていて探しきれませんでした。残念。hawklab.jpのはず。webアーカイブも探したのですけれどね。

さて。表題、『偽物JSON記法はJSONハイジャックに弱いかもしれない』と私が感じたわけですが。Objectクラスを書き換えてのJSONハイジャックを実験的に試みてみたところ、偽物のほうはどうも簡単に陥落してしまうという傾向を見出したからです。 偽JSONデータの階層の下の方で配列に格納された偽JSON連想配列が簡単にアクセスできてしまいます。その配列の親までの連想配列が、さきほど書いておいた「ブロック文にラベル登場!」とみなされてしまうからです。その反対に配列の中身ではラベルとはみなさないようです。あぁ!これでは簡単すぎます。

本物JSON記法なら絶対大丈夫、ということを主張するわけではないのですが、偽物では敷居がすこぶる低いなぁと感じた次第です。

偽JSONデータの例
{ResultSet:{Result:[{precision:"zip",Latitude:"37.7668",Longitude:"-122.3959",Address:"",City:"SAN FRANCISCO",State:"CA",Zip:"94107",Country:"US"}]}}

このままじゃ動きませんけれど
var Object = function Object() {
var foo = this;
var bar = function() {
var ret = "";
for(var x in foo) {
ret += foo[x] ;
}
alert(ret);
};
setTimeout(bar, 100);
}

これでLatitudeあたりをクロスドメインで参照できるかもです。偽JSONですから。