危険な 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 で実行すると確かにアクセスできた。
気になっていたのはオブジェクトタイプの JSON の value にある配列にも通用するのかどうかで、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 の部分でエラーとなりアクセスできない。