m2

危険な JSON を試してみた

Kazuho@Cybozu Labs: 安全な JSON, 危険な JSON (Cross-site Including?)
http://labs.cybozu.co.jp/blog/kazuho/archives/2007/01/cross-site_including.php
によると、FireFox では Array を上書きすることで配列タイプの JSON にアクセスできるということなので bookmarklet で試してみた。

JSON 復習(というか最近まで知らなかったこと)

Introducing JSON を参照すると、JSON にはオブジェクトタイプと配列タイプがあって、オブジェクトタイプは {} で囲まれた名前と値のペア、配列タイプは [] で囲まれた値の集合。
例)

object
{'name1':'value1','name2':'value2'}
array
['value1','value2','value3','value4']

値は string, number, object, array, true|false, null が設定できるが、名前は string のみ。だから

{name:'value'}

では JavaScript では間違いではないが、JSON としては間違いとなる。

JSON テスト

まず元記事のとおり、Array を上書きして配列タイプの JSON にアクセスしてみる。

javascript:
var w=window;
w._A=w._A||Array;
w.a=null;
/*overwrite Array*/
Array=function () {
    w.a=w._A.apply(this, arguments);
    return a;
};
/*emulate json*/
(function(){
    var d=document;
    var s=d.createElement('script');
    s.innerHTML="['top','secret']";
    d.body.appendChild(s);
})();
/*show data*/
if(w.a){
    alert(w.a.toSource());
}

改行とコメントを削除すると


FireFox1.5.0.9 で実行すると確かにアクセスできた。

気になっていたのはオブジェクトタイプの JSONvalue にある配列にも通用するのかどうかで、script 要素の中身を設定する部分を

    s.innerHTML="{'soft':['on','demand']}";

に変えてやってみた。

エラー: invalid label
ソースファイル: about:blank
行: 0, 列: 7
ソースコード:
{'soft':['on','demand']}

エラーになった。よかった。

これが

    s.innerHTML="{soft:['on','demand']}";

だと、


アクセスできてしまう。大きな違いだ。

また、

    s.innerHTML="{soft:new Array('on','demand')}";

なんてことをすると、Opera9 や IE6*1 でもアクセス可能になる。

まあそんなことやらんよなあ。

*1:この bokmarklet では s.innerHTML の部分でエラーとなりアクセスできない。