IEのcreateElementの不思議な挙動
善用も悪用も出来ない豆知識です。いくつかのバージョンのIEではcreateElementに不具合があります。以下のサンプルを見てください。
<!-- saved from url=(0014)about:internet -->
<html>
<head>
<title>FOO</title>
<script>
var strA;
strA = 'textarea'; //ここに文字列を設定可能だとしますvar myfunc = function () {
var nDiv, nElm;
nDiv = document.createElement('div');
nElm = document.createElement(strA);
nDiv.appendChild(nElm);
document.body.innerHTML = nDiv.innerHTML;
};
window.onload = myfunc;
</script>
</head>
<body>
</body>
</html>
上のサンプルでは、body要素にtextarea要素を流し込んでいます。ウェブアプリの実践ではこのようなことは、まず、しないと思いますけれど、私はかつて上記のような例題を複数みつけたことがあります。さて、上のサンプルにおける『textarea』が格納されているstrAという文字リテラルを第三者が設定可能だと考えてみましょう。createElementに不具合があるバージョンのIEでは不思議なことが起きます。以下のサンプルを見てください。JavaScriptが実行されてalert(0)の無限ループが発生することになるかと思います。
<!-- saved from url=(0014)about:internet -->
<html>
<head>
<title>FOO</title>
<script>
var strA;
strA = 'textarea style="width:expression(' +
'eval("a' +
'lert(0)")' +
')">FOO<' +
'/textarea><!-- ';
var myfunc = function () {
var nDiv, nElm;
nDiv = document.createElement('div');
nElm = document.createElement(strA);
nDiv.appendChild(nElm);
document.body.innerHTML = nDiv.innerHTML;
};
window.onload = myfunc;
</script>
</head>
<body>
</body>
</html>
IEではcreateElementメソッドに与える文字について検査していないので事実上なんでも良いという不具合です。このことがただちに脆弱性であると言えません。だいたいにおいて上のサンプルのようにcreateElementメソッドに悪意あるユーザが任意の文字列を与えることができるようなウェブサービスなんてありえない、と思っています。なお、サンプルではstyle属性をもちこんでのexpressionを使っていますが、替わりにonmouseover属性をもちこんだりすることも可能なようです。このときには不自然にinnerHTMLで流し込まなくともappendChildメソッドでうまくいくのではないかとお試し中です…うまくいくかなぁ????いずれにせよ、セキュリティ上は何も心配する必要がないような無駄知識です。でも何かしら脳ミソのニューロンが結線するのではないかと思って書いてみました。いかがでしょうか?