クローラ耐性診断ツール

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
/* -----codeの行番号----- */