先日 2008/08/27 のライトニングトークでとりあげたネタは下記エントリの内容であるのだが、
AjaxControlToolkit の CalendarExtender のカレンダーを日本語表記にする
http://devadjust.exblog.jp/7018028/
ちょっと補足を。
ライトニングトーク中でもちょこっと触れたが、eval で既存の定義を書き換えよう・再定義しよう、というアイディアは私のオリジナルではない。
原典は、その当時、一世を風靡した(?)下記ブログエントリである。
一行で IE の JavaScript を高速化する方法
http://d.hatena.ne.jp/amachang/20071010/1192012056
さてもうひとつ、この技法にセキュリティリスクはないのか、という質問を頂戴したのだが、自分の解釈ではセキュリティリスクはないと考えている。
そもそもは、コード書き換えをやろうとしているコードを読み込むようページをプログラミングしているのは他ならぬ開発者自身であるので、まずこの点では問題はないはずだ。
で、今回紹介したような技法でコードを乗っ取るような悪意のあるコードが発生するのでは、という懸念があるのだと推察しているが、それはもう、そのような悪意のあるコードが注入される時点でアウトなのだ。
JavaScript が動的言語であり、プロトタイプベースであることなどの理由から、実行時に既存の定義を書き換えできるので、これは JavaScript にとっては不思議でも何でもない。
将来、toString で定義が取得できなくなったり、eval の動作が制限されたりすることがあるかもしれないが、その場、この技法は使えなくなる一方、それでもなお、既存の関数の実行時の乗っ取りは防げるわけではなく、もう議論は別の話なのである。
ちなみに、おそらくさすがに eval は使っていないと思うが、ASP.NET AJAX Library の関数定義を乗っ取っていると思われる実例がある。
他ならぬ AJAX Control Toolkit である。
詳しくは下記エントリを参照していただきたい。
AjaxControlToolkit で Sys.UI.DomElement.setVisible の定義が置き換えられる?
http://devadjust.exblog.jp/7539291/
最後に。
実は Tech・Ed 2008 Yokohaa 参加のために出発する直前に、.NET 3.5 SP1 用の AJAX Control Toolkit がリリースされたことを知った。
さすがにフォローできなかったので、ライトニングトーク中では、この SP1 用 AJAX Control Toolkit でも本技法が必要なのか・適用できるのか、あえて触れずに済ませた。
後日確認次第、本ブログに記載できればと思う。
(あるいは、情報お持ちの方からのコメント大歓迎です)