# スキャンの種類

| | ベースライン (`--scan=baseline`、デフォルト) | フル (`--scan=full`) |
| --- | --- | --- |
| すること | クロールして、リクエストとレスポンスを確かめます (パッシブスキャン) | 同じことをしてから、各ページとパラメーターを攻撃します (アクティブスキャン) |
| 見つけるもの | セキュリティヘッダー、Cookie、トークンのないフォーム、エラーページ、ヘッダーのバージョンなど | 同じものと、XSS (反射型、持続型、DOM ベース)、SQL インジェクション、パストラバーサル、コマンドインジェクション、オープンリダイレクトなど |
| データの変更 | しません。ページを読むだけです | します。攻撃を入れたフォームを送るので、レコードを追加したり変更したりします |
| 実行する場所 | どの環境でも。ステージングのサーバーでも | テストのデータベースを使うテスト環境だけ |
| 時間 | 1、2 分ほど | 数分以上。攻撃は最大 `--scan-minutes` 分 (デフォルト 10) |

## ベースラインスキャン

ZAP は、サイトをトップページから `--minutes` 分 (デフォルト 1) クロールします。ページのリンクとフォームを、
[ログイン](https://pieceofcake2.github.io/security-dast/ja/login.md)を指定しなければログインしていない訪問者として、たどります (スパイダー)。各リクエストと
レスポンスを、パッシブスキャンのルールで確かめます。ヘッダー、Cookie、フォーム、ページとスクリプトの内容です。
攻撃は送らないので、どの環境でも、ステージングのサーバーでも実行できます (`--url=https://staging.example.com`)。

クロールで見つけるページは、実行ごとに少し変わります。JavaScript が作るリンクには、ブラウザでもクロールする
`--ajax-spider=1` を付けます (遅くなります)。操作を順に重ねないと届かないページには、クロールの代わりに
[End-to-End テスト](https://pieceofcake2.github.io/security-dast/ja/end-to-end.md)を使います。

## フルスキャン

フルスキャンでは、続けて、クロールやテストで見つけた各ページと各パラメーター (クエリ、フォーム、Cookie、ヘッダー) を、
ZAP のアクティブスキャンのルールで攻撃します。スクリプト、クォート、SQL、`../` の付いたパス、コマンド、ほかの
サイトの URL などの値を送り、送ったスクリプトがそのまま出力された、SQL のエラーが出た、などレスポンスに表れたものを
報告します。

```bash
vendor/bin/security-dast --scan=full --scan-minutes=20
```

- **データを変えます。** 攻撃を入れたフォームを何度も送るので、レコードが追加、変更、削除され、メールが送られることも
  あります。スキャンの組み込みウェブサーバー (デフォルト、テストのデータベース) か、データが消えてもよい自分の
  サーバーでだけ実行してください。本番では決して実行しないでください。
- **時間がかかります。** 攻撃は `--scan-minutes` 分 (デフォルト 10) までです。長いシナリオにはもっと必要です。時間が
  過ぎると、まだ攻撃していないパラメーターは検査されません。
- **多くの脆弱性を見つけますが、すべてではありません。** 攻撃は、レスポンスに表れた影響で見つけます。コードも
  [pieceofcake2/security-sast](https://pieceofcake2.github.io/security-sast/ja/) で確かめてください。

フルスキャンは、報告書の言語に関係なく、ZAP の Default Policy のすべてのアクティブスキャンのルールを実行します。

## CakePHP 2 と ZAP

ZAP は、CakePHP 2 のアプリケーションに合わせて設定してあります。

- `SecurityComponent` のフォームの CSRF トークン (`data[_Token][key]`) を知っています。そうしたフォームをトークンの
  ないフォームとして指摘せず、フルスキャンでは、攻撃ごとにフォームのページから、スキャンのセッションの中で新しい
  トークンを取り直すので、`SecurityComponent` に弾かれません。
- `SecurityComponent` が固定する欄 (`_method`、`data[_Token][fields]`、`data[_Token][unlocked]`) は攻撃しません。
  これらを変えると必ず弾かれるので、攻撃しても時間がかかるだけです。
- CakePHP のセッションの Cookie (`CAKEPHP`) を知っています。
- ユーザーとしてのスキャンがログインしたままでいられるよう、ログアウトの URL (`.*logout.*`、`--exclude` を参照) は
  除きます。

## どこで何を実行するか

| いつ | スキャン |
| --- | --- |
| push と pull request のたび | ベースラインスキャン。訪問者として、と[ユーザーとして](https://pieceofcake2.github.io/security-dast/ja/login.md) |
| 毎晩、またはリリースの前 | CI のテストのデータベースで、[End-to-End テスト](https://pieceofcake2.github.io/security-dast/ja/end-to-end.md)のフルスキャン |
| ステージングへのデプロイのあと | `--url` でベースラインスキャン |

ワークフローは [GitHub Actions での CI](https://pieceofcake2.github.io/security-dast/ja/ci.md) をご覧ください。

## DAST で見つけられないもの

- スキャンが届かないページ。ユーザーと End-to-End テストを与えてください。
- アプリケーションのルール。あるユーザーがほかのユーザーのデータを見たり変えたりできるか
  (ほかのユーザーの `/orders/view/12`)、管理者だけができるはずのことができるか、などです。アプリケーションの
  テストで確かめてください。
- 複数の手順や時間に関わるもの。2 つのリクエストの競合などです。
- どのレスポンスにも表れないもの。パスワードの弱いハッシュや、コードの中の秘密などです。
  [pieceofcake2/security-sast](https://pieceofcake2.github.io/security-sast/ja/) (設定の検査で既定の salt や鍵も
  見つけます) と [pieceofcake2/security-sca](https://pieceofcake2.github.io/security-sca/ja/) (パッケージ) を
  ご覧ください。
