関係ないところで共感する

This entry was posted by on Friday, 20 April, 2007

まつもとさんの XML の話はだいたい主張が強すぎて100%の同意はしづらいことが多いんだけど、 http://www.rubyist.net/~matz/20070416.html#p01 についてはおおむね同意。でもここで言いたいことはそうではなく、

>

JSONについては、外から受け取ったデータを安易にevalに渡してしまうようなケースの方が心配。

というのが、 JavaScript でプログラムを書いていて気になっているところです。っていうかつまりなんだ、いきなり eval するわけですよね。もしトンでもないことが書いてあったら任意のコードを実行できてしまうんじゃねえかと。

JavaScript 以外の言語の場合、 JSON ライブラリというのはふつうにパースして何らかの内部表現に変換するわけですから、奇妙なものが混じっていてもパースエラーにできるんですが。かといって JavaScript で JSON パーサを書く、っていうのも、なんというかいかにもアホくさくていいですなあ。

MochiKit のコードを見ると、 () で括って eval しているんですが、そういう方式が一般的なのかな。言語仕様上、複数の文が入れられないとか、そういうことを利用したハックなんですかね。

つまり、

some_evil_proc(); {"normal": "json"}

みたいなプログラムは取り除ける。でも、

{"some": evil_proc(), "normal": "json"}

みたいな ill-formed な JSON は省けないよねえ、とか思うんですけれども、実際がとこ、どういう感じなんでしょうね。

っていう話については JavaScript の専門家諸氏からは実質的な危険についての詳しいアドヴァイスがすぐにどこかで掲載されると思うんですけれども、うーん、まあ、気分的なものなのかな、っていうのは思うんですけれども、シリアライズされたデータを取り出すのに eval するしかないってのは私は感覚的にイヤなんですよね。でも JSON のメリットってそこだからねえ。

3 Responses to “関係ないところで共感する”

  1. k.inaba

    普段はJavaScriptで書いたJSONパーサを使ってる人です。

    ()でくくるのは、単にそうしないとevalできないからだと思います。
    evalは渡された文字列をStatementのリストとして評価するんですが、ExpressionStatementは { で開始できない
    http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/12_Statements.html#ExpressionStatement
    ので、()でくくって曖昧さを除かないとダメなのです。

  2. 向井

    あーなるほど。そういう縛りはあんまり考えていませんでした。そういえばそうか……。ecmascriptの仕様は読んだことないのでだめだめでした。

    ところで、やっぱり JSON パーサを使っている人というのもいるのですね。

  3. arton

    http://slashdot.jp/security/article.pl?sid=07/04/03/2211239
    このあたりですね。