GitHub - yukisov/web-sindan-crawler: IPA ウェブ健康診断仕様の「クローラへの耐性」を診断するコマンドラインツール
IPA ウェブ健康診断仕様の診断項目「(M)クローラへの耐性」の診断を行うコマンドラインツールです。
検索エンジンをはじめとしたWebサイトを自動で巡回するプログラムに対して、特定のWebサイトがその巡回アクセスに耐えられるかどうかを診断します。
診断対象となる1つのURLを指定すると、以下の動作を自動で繰り返して対象サイトのクローラへの耐性を診断し、最後に診断結果を表示します。URLにアクセスする。
↓ ↑
レスポンスボディから内部リンクのURLを収集する。
※ 本プログラムは IPA とは関係ありません。非公式です。
インストール
$ git clone https://github.com/yukisov/web-sindan-crawler.git $ cd web-sindan-crawler $ ant(Javaプログラムをビルドするためのツール) Command 'ant' not found, but can be installed with: sudo apt install ant antが入っていないのでインストール。 $ sudo apt install ant ~(中略)~ done. Java実行環境も必要なのでインストール。 $ sudo apt install default-jre $ java --version openjdk 11.0.20 2023-07-18 OpenJDK Runtime Environment (build 11.0.20+8-post-Ubuntu-1ubuntu120.04) OpenJDK 64-Bit Server VM (build 11.0.20+8-post-Ubuntu-1ubuntu120.04, mixed mode, sharing) $ pwd /demandosigno/web-sindan-crawler $ ant ~(中略)~ BUILD SUCCESSFUL $ ls LICENSE README.md bin build build.xml conf lib src test buildディレクトリが作成されたので入る。 $ cd build/ $ ls WSC.bat WSC.sh conf lib
検査実行
診断するURLを引数にして実行。(http(s)://は省略できる)
$ ./WSC.sh http://172.19.0.2:3128/todo/
出力内容 プログラム実行中、以下の項目が画面に出力されていきます。
No. / Elapsed / Status / RTT / URL
通番 / 経過時間(分:秒) / HTTPステータスコード / 応答時間(秒) / アクセスURL
しかしどうも検査が無限ループしているようです。
http://172.19.0.2/todo/todolist.php?TODOSESSID=ca3465e0f5cf689f25c8de0327a5b963&rnd=64e0f82295575&id=1
http://172.19.0.2/todo/todolist.php?TODOSESSID=ca3465e0f5cf689f25c8de0327a5b963&rnd=64e0f82295652&id=2
http://172.19.0.2/todo/todolist.php?TODOSESSID=ca3465e0f5cf689f25c8de0327a5b963&rnd=64e0f8229572f&id=3
のように、id別にきちんとクロールしてくれていますが、クエリ文字列 rnd がランダムで付与されますので、それを別URLとして幾らでも検査してしまうようです。
http://172.19.0.2/todo/todolist.php?TODOSESSID=ca3465e0f5cf689f25c8de0327a5b963&rnd=64e0f8d20be13&id=1
http://172.19.0.2/todo/todolist.php?TODOSESSID=ca3465e0f5cf689f25c8de0327a5b963&rnd=64e0f8d20bf0c&id=2
http://172.19.0.2/todo/todolist.php?TODOSESSID=ca3465e0f5cf689f25c8de0327a5b963&rnd=64e0f8d20bfec&id=3
これはBadTodoの仕様なので仕方がないです。
https://github.com/ockeghem/badtodo/blob/main/docs/usage.md
クエリ文字列 rnd は乱数文字列が入っていますが、アプリ側で利用はされておらずキャッシュバスターとして使われています。診断対象とする必要はありません。
キャッシュバスターの意味については徳丸本2版の4.15.2節「キャッシュからの情報漏洩」中の「◆ URLに乱数値を付与する方法」を参照ください。
とりあえず診断は最大40分なので終了まで待ってみました。
結果の確認
「ウェブ健康診断仕様」のルールとして「診断開始から 40 分が経過した場合、その時点で診断を終了とします。」とあるため、ツールのデフォルト設定でも「2,400秒=40分」で診断終了となります。
No::4227 Elapsed::40:00 Status::200 RTT::0.05 URL::http://172.19.0.2/todo/export.php?TODOSESSID=ca3465e0f5cf689f25c8de0327a5b963&rnd=64e0fd3275f46 ---------------------------------------------------------------------- Reason for the termination : Timed out. (Max time: 2400 minutes) 診断終了の理由 合計時間(分:秒) Total elapsed time : 40:00 No Response Count : 0 タイムアウトになったリクエスト数 StatusCode 400-599 Count : 3 ステータスコードが400番台or500番台だったレスポンスの数 Total number of requests : 4227 アクセスしたURLの数 ????: ? ?? 診断結果(正常 or 異常):危険度(中 or 低) ----------------------------------------------------------------------
DockerのTerminal上では診断結果が ??? と文字化けしていましたが、結果のログファイルを見ると問題なく確認できました。
# tail WSC_202308200154.log No::4226 Elapsed::39:59 Status::200 RTT::0.05 URL::http://172.19.0.2/todo/todolist.php?TODOSESSID=ca3465e0f5cf689f25c8de0327a5b963&rnd=64e0fd220a024 No::4227 Elapsed::40:00 Status::200 RTT::0.05 URL::http://172.19.0.2/todo/export.php?TODOSESSID=ca3465e0f5cf689f25c8de0327a5b963&rnd=64e0fd3275f46 ---------------------------------------------------------------------- Reason for the termination : Timed out. (Max time: 2400 minutes) Total elapsed time : 40:00 No Response Count : 0 StatusCode 400-599 Count : 3 Total number of requests : 4227 診断結果: ○ 正常 ----------------------------------------------------------------------
結果判定も「ウェブ健康診断仕様」のルールに沿っており、以下のどれにも該当しませんので「正常」と診断されました。
(3) HTTP レスポンスの HTTP ステータスコードにおいて、400 番台又は 500 番台のエラーが発生し、かつこの状態が、5 回連続で発生した場合
(4) HTTP レスポンスの HTTP ステータスコードにおいて、400 番台又は 500 番台のエラーが発生する状態が、累計で 10 回発生し、かつ以下の計算式で算出される値が 10%以上であった場合
(計算式) 10 ÷ アクセスの総数 × 100%
(6) HTTP レスポンスの HTTP ステータスコードにおいて、400 番台又は 500 番台のエラーが発生する状態が、累計で 10 回発生し、かつ以下の計算式で算出される値が 10%未満であった場合
(計算式) 10 ÷ アクセスの総数 × 100%
ステータスコードが400番台or500番台だったレスポンス # grep -E 'Status::4..|Status::5..' WSC_202308200154.log No::0002 Elapsed::00:01 Status::403 RTT::0.21 URL::http://172.19.0.2/adminer.php?server=db&username=root No::0003 Elapsed::00:01 Status::404 RTT::0.01 URL::http://172.19.0.2/mail/ No::0006 Elapsed::00:03 Status::404 RTT::0.01 URL::http://172.19.0.2/todo/attachment/memo.txt