XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム 早瀬康裕†, 鷲尾 和則‡, 松下 誠†, 井上 克郎† † 大阪大学大学院情報科学研究科 ‡ 大阪大学大学院基礎工学研究科 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 背景 HTML文書の普及 HTML文書は、タグ付け規則に従って記述することが必要 タグ付け規則に違反したHTML文書は、ブラウザで正しく表示されない などの問題がある. DTD(文書型定義)にタグ付け規則が定義されている HTML文書へのスクリプト埋め込み スクリプトは任意の HTML 文書の断片を出力することが可能 既存のHTML構文検証ツールはスクリプトの内容を無 視 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 2 スクリプトによる HTML 生成の例 <span> <script type="JavaScript"> <![CDATA[ var day = new Date(); var message; if(day.getHour() < 12){ message = "good morning"; } else { message = "<div>good afternoon</div>"; } document.write(message); ]]> </script> </span> 午前のとき <span> good morning </span> 午後のとき <span> <div>good afternoon</div> </span> DTD違反 変数が取りうる値を知る必要 既存のシステムでは script 要素を無視するため、 違反を検出できない Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 3 DTD 検証ツール ECMAX スクリプトの出力を考慮した DTD 検証ツールECMAX † XHTML 1.0 ECMAScript (ECMA-262) にいくつかの制限を加えたもの (関数やオブジェクトに非対応) 手順 引数に変数が含まれていた場合には、 変数が取り得る値を知る必要がある 1. XHTML を解析し、スクリプトを抽出 2. 出力文を探し、出力文の引数が取りうる値を計算 3. 2. の結果と、出力文の属する制御構造 (条件文や繰り返し文) から、出力されうる文字列を計算 4. 3. の結果を、静的な部分と合わせて DTD 検証 † 鷲尾和則, 松下誠, 井上克郎, “JavaScriptを含んだHTML文書に対するデータフロー解析を 用いた構文検証手法の提案”, 信学技報, SS2002-22, pp. 13-18, 2002 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 4 フローグラフ ECMAScript プログラムから、フローグラフを作成 頂点: 文または式 有向辺: 制御が移り得ることを示す 1 m=“abc” m=“abc”; if (x) { m=x; } document.writeln(m); 2 x 3 m=x 4 document.writeln(m) Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 5 候補集合 変数が特定の文の実行直後に取り得る値を候補、候補全 体の集合を候補集合と呼ぶ 候補とは以下のいずれか 定数 “abc”, 123, true, undefined, null 等 不定値 型の分かっているもの String, Numeric, Boolean 型の分からないもの 未計算の式 式には、候補集合を含む場合がある 候補集合は、変数名と頂点番号の組で識別する 例:頂点 5 を実行した直後の x の値 ⇒ x5 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 6 候補集合の計算 値を調べたい頂点・変数を、対象頂点・対象変数と呼ぶ 1. 対象頂点を起点として、フローグラフの辺を逆向きにたどり、 対象変数への代入文を含む頂点を探す 1 2. 見つかった頂点それぞれに対して m=“abc” 2 代入文の右辺に変数を含まないなら、右辺の値を候補集合に追 x 加する 3 代入文の右辺に変数が含まれる場合 m=x その変数の候補集合を計算中でないなら、候補集合を再帰的に計算し、 代入した結果を候補集合に追加 4 document.writeln(m) 変数の候補集合を計算中の場合は、変数を候補集合の記号で置き換え た、未計算の式を候補集合に追加 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 7 候補集合の計算 1 m=“abc” m=“abc” a=“abc” 2 値を調べたい頂点・変数を、対象頂点・対象変数と呼ぶ x 3 1. 対象頂点を起点として、フローグラフの辺を逆向きにたどり、 m=x a=x 対象変数への代入文を含む頂点を探す 4 2. 見つかった頂点それぞれに対して document.writeln(m) 代入文の右辺に変数を含まないなら、右辺の値を候補集合に追 加する 代入文の右辺に変数が含まれる場合 その変数の候補集合を計算中でないなら、候補集合を再帰的に計算し、 代入した結果を候補集合に追加 変数の候補集合を計算中の場合は、変数を候補集合の記号で置き換え た、未計算の式を候補集合に追加 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 8 候補集合を計算中の場合の処理 変数の計算中の場合は、変数を候補集合の記号 で置き換えた未計算の式を候補集合に追加 未計算の式を除去 候補集合自身を含まない候補を代入 新たな候補が得られたら、不定値とする i1 i3 0 3+ 1 i… 1, 不定数値 i3+1 の i3 に、 1 を代入 ↓ 2 1 i=0 2 document.writeln(i) 3 i=i+1 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 9 システムの実装と実験 変数値候補計算アルゴリズムを、XHTML 検証システム ECMAX に実装し、 既存のシステムと比較実験を行った 開発および実行環境 J2SDK 1.3.1, JavaCC 2.1 OS: FreeBSD 4.7 CPU: Pentium4 2GHz RAM: 2GB システムの規模 9,000 行 (うち、値候補計算部は 3,000 行) 比較対象 Another HTML-lint ver2.49 データ JavaScript を含むHTML 文書: 232 個 出展: THE JAVASCRIPT SOURCE http://javascript.internet.com Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 10 実験結果 ツール DTD ECMAX htmllint XHTML1- XHTML1XHTML1- XHTML1Strict Transitional Strict Transitional XHTML構文違反 10 10 スクリプト構文違反 48 -- スクリプト内XHTML構文違反 43 (14) -- スクリプト内タグを含めた タグ付け違反 18 (14) -- DTD違反 113 (35) 65 (12) 153 8 違反なし 0 (0) 48 (23) 69 214 合計 232 (63) 232 ()内は、スクリプトの出力に不定値が含まれていた数 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 11 実験結果 ツール DTD ECMAX htmllint XHTML1- XHTML1XHTML1- XHTML1Strict Transitional Strict Transitional XHTML構文違反 10 10 スクリプト構文違反 48 -- スクリプト内XHTML構文違反 43 (14) -- スクリプト内タグを含めた タグ付け違反 18 (14) -- DTD違反 113 (35) 65 (12) 153 8 違反なし 0 (0) 48 (23) 69 214 合計 232 (63) 232 htmllint は、スクリプトの中身を考慮しないため、違反なしが多くなっている ()内は、スクリプトの出力に不定値が含まれていた数 ECMAX では、スクリプト内での違反も発見できた Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 12 実験結果 ツール DTD ECMAX htmllint XHTML1- XHTML1XHTML1- XHTML1Strict Transitional Strict Transitional 出力に不定値が含まれた場合、その中にはタグは無いと仮定している 10 10 XHTML構文違反 ⇒ 検証結果は確実ではない 48 -スクリプト構文違反 スクリプト内XHTML構文違反 43 (14) -- スクリプト内タグを含めた タグ付け違反 18 (14) -- DTD違反 113 (35) 65 (12) 153 8 違反なし 0 (0) 48 (23) 69 214 合計 232 (63) 232 ()内は、スクリプトの出力に不定値が含まれていた数 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 13 実験結果の考察 スクリプトを考慮することで、既存のシステムが 見逃していた違反を発見できた 正しい XHTML 文書作成を補助できる 約1/3のデータで、出力に不定値が含まれていた 不定値を含む検証は、確実ではない 不定値を減らすため、計算精度の向上が必要 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 14 まとめと今後の課題 まとめ ECMAScript プログラムで、変数が取りうる値を計算する手法につ いて説明 XHTML 構文検証ツール ECMAX に実装 既存のツールと比較実験 今後の課題 計算精度の向上 条件式の値を考慮 値の範囲を特定 ECMAScript に加えた制限を緩和 関数への対応 オブジェクトへの対応 Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 15
© Copyright 2024 ExpyDoc