JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文

Download Report

Transcript JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文

JavaScriptを含んだHTML文書に対する
データフロー解析を用いた構文検証手法の提案
鷲尾 和則†, 松下 誠‡, 井上 克郎‡
†大阪大学大学院基礎工学研究科
‡大阪大学大学院情報科学研究科
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
背景
インターネットの普及によりHTML文書が多数作成されてい
る
タグ付け規則に従ってHTMLを記述することが必要
タグ付け規則に違反したHTML文書はブラウザで正しく表示されな
いなどの問題がある
タグ付け規則はDTD(文書型定義)に定義されている
HTML文書にJavaScriptを記述することが頻繁にある
JavaScriptは任意のHTML文書の断片を出力することが
可能である
既存のHTML構文検証ツールはJavaScriptの内容を無視する
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
目的
JavaScriptの内容を考慮してHTML文書の構文検
証を行う
タグ付け規則通りに正しく記述されているか
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3
以前提案した手法
JavaScriptの内容を考慮したHTML文書の構文の
検証方法を提案した
インタープリタを用いてJavaScriptが出力するHTML記
述の断片を取得する
スクリプト以外のHTML記述と合わせて構文の検証を
行った
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
4
問題点
JavaScriptの実行結果(出力内容)は動的に変わり
得る
実行するたびに検証結果が変わり得る
すべての実行結果について検証する必要がある
現実的ではない
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
5
新しい手法の提案
JavaScriptの出力文字列を正規表現を用いてパ
ターン化
選択
→ |
繰り返し → *
パターンについて検証を行う
何度も実行しなくとも,すべての実行結果について
検証することができる
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
6
対象
HTMLは構文検証について曖昧な点がある
厳密に定義されたXMLで記述されたXHTML文書
を検証の対象とする
JavaScriptは特定のブラウザに固有のメソッドなどが
含まれる
ECMAによって標準化されているECMAScriptを対
象とする
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
検証手法
入力:ECMAScriptを含む
XHTML文書
出力:検証結果
構文解析
XHTML文書 DOMツリー ECMAScript
パターン化
次の3フェーズからなる
フェーズ1:XHTML文書解
析
フェーズ2:スクリプト解析
フェーズ3:パターンの構文検
証
抽出
検証
DTD
A*(B|C)
パターン
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
8
検証手法
入力:ECMAScriptを含む
XHTML文書
出力:検証結果
構文解析
XHTML文書 DOMツリー ECMAScript
パターン化
次の3フェーズからなる
フェーズ1:XHTML文書解
析
フェーズ2:スクリプト解析
フェーズ3:パターンの構文検
証
抽出
検証
DTD
A*(B|C)
パターン
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
9
検証手法
入力:ECMAScriptを含む
XHTML文書
出力:検証結果
構文解析
XHTML文書 DOMツリー ECMAScript
パターン化
次の3フェーズからなる
フェーズ1:XHTML文書解
析
フェーズ2:スクリプト解析
フェーズ3:パターンの構文検
証
抽出
検証
DTD
A*(B|C)
パターン
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
10
検証手法
入力:ECMAScriptを含む
XHTML文書
出力:検証結果
構文解析
XHTML文書 DOMツリー ECMAScript
パターン化
次の3フェーズからなる
フェーズ1:XHTML文書解
析
フェーズ2:スクリプト解析
フェーズ3:パターンの構文検
証
抽出
検証
DTD
A*(B|C)
パターン
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
11
フェーズ1
XHTML文書についてXML構文解析を行う
構文解析結果はDOMツリー
要素の親子関係などが判定できる
スクリプトはスクリプト要素として解析されるが,スクリプト
の中身は単なるテキストデータとみなされる
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
12
フェーズ2 –概要–
フェーズ1で得られたスクリプトに対して次の解析を
行う
Step1. 構文解析および意味解析を行う
Step2. 出力文に含まれる変数についてデータフロー解析を
行う
Step3. 出力文字列を正規表現を用いてパターン化する
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
13
フェーズ2 –Step1–
Step1. 構文解析 / 意味解析
1. ECMAScriptの言語仕様(ECMA-262)に基づいて字
句解析と構文解析を行う
解析結果は抽象構文木
2. 1で得られた抽象構文木に対し,意味解析を行う
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
14
フェーズ2 –Step2–
Step2. データフロー解析
抽象構文木をルートから順に辿りながら
変数が定義された → 変数表に追加
変数が参照された → 変数表を参照.定義されている位置
を判定し,変数とその位置を記したリストを作る.
変数の代入・参照関係がわかる
var a = 1;
:
データフロー
:
b = a + 1;
定義
Line 1 : a
Line 2 : b
参照
Line 4 : c
変数表
スクリプト
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
15
フェーズ2 –Step3(パターンとは)–
Step3. 出力文字列のパターン化
パターンとは?
if文の条件分岐により、一方の実行経路では”A”という文字列
が、他方の実行経路では”B”という文字列が出力される
双方をまとめて記述する
A | B ・・・ A または B (正規表現を用いたパターン)
while文などの繰り返し文
– ex) C* (Cの繰り返し)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
16
フェーズ2 –Step3(パターン化の方法)–
Step3. 出力文字列のパターン化
1. Step2で出力文に含まれる変数についてデータフロー解析を行い,
その変数の代入・参照関係を得る
2. 1で得られた関係をもとに変数の値を求める
動的にその値が定まるものは不定値とする
変数の型を値として代用する
クラスライブラリ(のメソッド)を用いた処理があった場合,不定値とする
3. 2で求められた値について
それぞれのブロックで出力される文字列を括弧でくくる
出力文がif文など選択文の制御下にあれば | を付加する
出力文がwhile文など繰り返し文の制御下にあれば * を付加する
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
17
フェーズ2 –パターン化例–
a = Math.floor(Math.random()*10);
b = “hoge”;
if (a>5) {
document.write(“<B>”);
document.write(a);
“<B>”, int, “</B>”
document.write(“</B>”);
} else {
for (i=0;i<10;i++) {
document.write(“<C>”);
document.write(b);
“<C>”, “hoge”, “</C>”
document.write(“</C>”);
}
}
(“<C>”, “hoge”, “</C>”)*
(“<B>”, int, “</B>”) | (“<C>”, “hoge”, “</C>”)*
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
フェーズ3 –概要–
パターンの構文検証
1. 開始タグと終了タグの対応付け
フェーズ2で得られた出力文字列のパターンについて、そこから
開始タグと終了タグを対応付け、要素のパターンにする
2. 要素パターンの検証
要素のパターンについて検証を行う
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
19
フェーズ3 –タグの対応付け–
1. 開始タグと終了タグの対応付け
開始タグと終了タグに何も付加されていない
そのまま対応付け
<A>...</A>
要素A
開始タグと終了タグに | が付加されている
すべての組み合わせについて対応付け
(<A>|<B>)...(</B>|</C>)
要素B
開始タグと終了タグに * が付加されている
要素のネスト
(<C>)*...(</C>)*
要素Cのネスト
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
20
フェーズ3 –要素パターンへの変換–
1.
開始タグと終了タグの対応付
け
1.
2.
3.
4.
対応付けの例
出力文字列パターンについて最 “<A>”,((“<B>”,”</B>”)|(“<C>”,”</C>”)*),”</A>”
も内側の括弧から先述の対応
付けを行う
“<A>”,(( B )|( C )*),”</A>”
対応付けができた要素を判定
する
対応付けができなくなったら、括
“<A>”,( B | C* ),”</A>”
弧に|や*が付いている場合、
2で得られた要素に付加する
“<A>”, B | C* ,”</A>”
外側の括弧へ移行し対応付け
を行う
この時対応付けできた要素は、
3の要素パターンの親要素
※不定値についてはテキストデータと
みなす
A
B |C*
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
21
フェーズ3 –要素パターンの検証–
2. 要素パターンの構文検証
1によりすべての要素について、その子要素をパターンで表すこと
ができる
それぞれの要素の子要素パターンについて、DTDで定義されたパ
ターン(正規表現)と検証する
正規表現の包含関係判定問題
要素パターンがDTDの定義パターンに含まれれば違反していない
違反するパターンがあれば,データフロー解析の結果から違反を起こす実
行経路 (危険なパス) を提示する
不定値に由来するテキストが含まれる場合は,条件付きで検証を行う
違反しない = 不定値にタグが含まれない場合のみ
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
22
フェーズ3 –パターン検証(包含判定)–
正規表現の包含判定
簡単化のため要素パターンの側で以下の置き換えを行う
a* = ε| a | aa
DTDで用いられる繰り返しの正規表現
a? : 0 回 or 1 回
a* : 0 回以上
a+ : 1 回以上
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
23
検証例 –あいさつスクリプト–
var a = “good morning”
var b = “good afternoon”
Date day = new Date();
document.write(“<UL>”)
if(day.getHour() < 12){
document.write(“<LI>”);
document.write(a);
document.write(“</LI>”);
}else{
document.write(b);
}
document.write(“</UL>”);
“<UL>”,
(( “<LI>” , ”good morning” , ”</LI>” )
| ”good afternoon” ) ,
”</UL>”
UL
LI
“good afternoon”
“good morning”
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
24
検証例 –検証内容–
検証
UL要素の子要素はLI+(1
回以上のLI要素)
UL
LI
“good afternoon”
“good morning”
UL要素の子要素は ( LI要素 |
テキスト )
LI要素の子要素はテキスト
LI要素は違反しない
テキストは違反する
LI要素の子要素は
#PCDATA(テキスト)
テキストは違反しない
UL要素の子要素としてテキ
ストが来る場合、違反する
else 節の変数 b が違反
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
25
検証例 –検証結果(危険なパス)–
var a = “good morning”
var b = “good afternoon”
Date day = new Date();
document.write(“<UL>”)
if(day.getHour() < 12){
document.write(“<LI>”);
document.write(a);
document.write(“</LI>”);
}else{
document.write(b);
}
document.write(“</UL>”);
DTD違反となる実行経路
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
26
本手法の有効性
本手法が有効な場合
出力文字列は静的に定まる
実行経路が複数ある (不定である)
本手法が有効でない場合
出力文字列が動的に定まる (不定値が含まれる)
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
27
まとめ
ECMAScriptを含むXHTML文書について,スクリプ
トの出力文に対してデータフロー解析を行い,出力
文字列をパターン化し,そのパターンを検証すること
で,構文の検証を行う手法を提案した
本手法により,ECMAScriptのすべての実行結果に
ついて,構文を検証することができる
XML処理プログラムが出力するXML文書に対して
も,同様の方法で検証できる
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
28
今後の課題
本手法をシステムに実装し,検証精度などについて
評価を行う必要がある
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
29