# 自動巡回

:::info
本チュートリアルで扱う機能は、Web アプリケーション診断機能をご契約いただいた組織でのみご利用いただけます。
:::

Shisho Cloud では診断対象アプリケーションのエンドポイントを洗い出すために、自動巡回機能を提供しています。アプリケーションのトップページを入力すると、Shisho Cloud はページ中のリンクやフォームを辿ってアプリケーションを自動で巡回し、エンドポイントを洗い出します。

## 巡回

まず、「ジョブ一覧」ページ (`https://cloud.shisho.dev/[orgid]/applications/[appid]/jobs/find`) に移動し、「エンドポイントを登録」ボタンをクリックします。

![「巡回ジョブ」タブ](/docs/ja/_md-assets/b69a6a0604-crawling-job-list-empty.png)

次に、ボタンを押すと表示されるサイドオーバーにおいて「エントリーポイントを指定し、クローラーによる自動巡回を実行する」のオプションを選択してください。

![サイドオーバー](/docs/ja/_md-assets/89abbd5d65-crawling-sideover.png)

巡回ジョブの「エントリーポイント」欄には、巡回の起点となる URL を指定します。ログインが不要なアプリケーションではトップページを、ログインが必要なアプリケーションではログイン後のトップページを指定すると良いでしょう。エントリーポイントを入力したら、「予約」ボタンをクリックします。

![フォーム](/docs/ja/_md-assets/6dbb594ae7-crawling-job-form.png)

巡回ジョブを予約してからしばらく待つと、Shisho Cloud は指定した URL を起点にページ内のリンクやフォーム等を自動で探索して辿り、エンドポイントやシナリオを登録していきます。

![巡回ジョブ詳細画面](/docs/ja/_md-assets/fffe45c879-crawling-job-details.png)

## 巡回結果の修正

Shisho Cloud は巡回中にフォームを検出した際に、入力欄を自動で記入して送信します。しかし場合によっては、自動で入力されたパラメータが適当でないことがあります。そのような場合には、入力すべきパラメータを手動で指定することができます。

「エンドポイント」タブを開き、パラメータを修正したいエンドポイントを選択します。

![エンドポイントタブ](/docs/ja/_md-assets/d58475a4f2-crawling-job-endpoints-before-amending.png)

エンドポイントの更新画面では、YAML 入力欄にエンドポイントのパラメータが記載されています。例えば以下のエンドポイントには、`name` というパラメータに対し、`shisho` という値が自動で入力されています。

![エンドポイント更新画面](/docs/ja/_md-assets/613473bde8-endpoint-edit-before.png)

`name` パラメータの値として `shisho` ではなく例えば `テスト` という値を指定したい場合には、`value` の箇所を `テスト` に書き換えます。

![エンドポイント更新画面](/docs/ja/_md-assets/aa00c47fdc-endpoint-edit-after.png)

パラメータを修正したら、右上の「保存」ボタンをクリックしてください。すると、今後の診断ジョブではこの修正したパラメータを用いてリクエストが送信されます。

## シナリオの修正

エンドポイントの機能によっては、そのエンドポイントにリクエストを送信する前に、別のリクエストを送信しておく必要があることがあります。例えば削除系のエンドポイントでは、削除のリクエストを送信する前に、削除対象のリソースを作成しておく必要があるでしょう。このようなケースでは、「作成リクエストを送信した後に削除リクエストを送信する」というシナリオを設定することにより、削除系のエンドポイントを効果的に診断できます。

シナリオを編集するには、「シナリオ」タブを開き、編集したいシナリオを選択します。

![シナリオタブ](/docs/ja/_md-assets/d31b641f87-scenario-list-before-amending.png)

「更新」タブを選択すると、シナリオを編集できます。

![シナリオ更新画面](/docs/ja/_md-assets/95141e0c33-scenario-edit-before.png)

このチュートリアルでは、削除リクエストの前に作成リクエストを送信しておくようなシナリオの設定方法を説明します。シナリオの定義に関する網羅的な説明については、[リファレンス](/g/concepts/web-application/spec#scenario)を参照してください。

![シナリオ更新画面 (編集後)](/docs/ja/_md-assets/58e6c72fa2-scenario-edit-after.png)

まず、Step 1. の上にある「Add step」ボタンをクリックして、削除リクエストの前にステップを追加します。

追加した Step のエンドポイント欄の「Select」ボタンをクリックし、作成リクエストを送信するエンドポイントを選択します。エンドポイントが多い場合には、検索欄にパスを入力して絞り込むと探しやすいでしょう。

![エンドポイントを絞り込む](/docs/ja/_md-assets/7e9d2e8155-scenario-edit-filter-endpoints.png)

エンドポイントを選択したら、「Select」ボタンをクリックして選択を確定します。

次に、作成リクエストのレスポンスからリソースの ID を抽出し、削除リクエストに注入するための設定を入力します。ここでは作成時のレスポンスにおけるリソース ID が、ヘッダーに `Location: /mypage/items?id=XXXX` という形で記載されていると仮定します。このような場合では、Step 1. の YAML 入力欄に以下のような設定を入力し、抽出方法を指定します。

```yaml
extractors:
  - type: regex
    part: header
    name: id
    group: 1
    regex:
      - 'Location: /mypage/items\?id=([a-z0-9]+)'
```

この設定により、`Location: /mypage/items?id=XXXX` の中の `XXXX` の部分が抽出され、`id` という名前の変数に値が格納されます。レスポンスの異なる部分を抽出したい場合には、[リファレンス](/g/concepts/web-application/spec#extractor)を参考に記述してください。

次に、Step 2. にて抽出した ID を注入するための設定を入力します。削除リクエストのボディ中の `id` パラメータに注入する場合の設定を以下に示します。

```yaml
bindings:
  - type: body
    key: .id
    extractorName: id
```

この設定により、先ほど抽出した `id` 変数の値が、削除リクエストのボディ中の `id` パラメータに設定されます。異なるパラメータに注入したい場合には、[リファレンス](/g/concepts/web-application/spec#bindings)を参考に、`key` の部分を適切なパラメータ名に置き換えてください。

:::tip
作成リクエストや削除リクエストにおいて CSRF トークン等が必要な場合には、CSRF トークンを抽出するためのステップの追加が必要です。
:::

以上の設定を入力したら、「保存」ボタンをクリックしてください。

次に、[Web 診断を実行する](/docs/ja/g/getting-started/register-web-applications/execute-scan/index.md)手順に進みます。
