基本的なウェブアプリケーションセキュリティの学習用サンプルアプリケーションです。
- PHP 5.4.x 以上
- PDO の SQLite ドライバが必要
$ make install
以下のコマンドを実行したのち、ブラウザから http://localhost:8888/ にアクセスしてください。
$ make server
localhost:8888 以外のホスト名とポート番号の組み合わせでサーバを起動したい場合は、以下のようにして希望するホスト名とポート番号を指定してください。
$ SERVER_HOST=127.0.0.1 SERVER_PORT=8889 make server
いまのところ、以下の脆弱性が体験できるように作っています。
- ログイン画面 (等) における SQL Injection 脆弱性
- ログイン画面における XSS 脆弱性
- 「ぼやき」のタイムライン表示における XSS 脆弱性
- 「ぼやき」の投稿フォームにおける XSS 脆弱性
- 「ぼやき」の投稿処理における CSRF 脆弱性
以下のようなディレクトリ構成を取っています (ここに書かれていないものは気にしなくてよいです)。
.
├── src …… ライブラリ類 (ディレクトリ構成は PSR-4 準拠 / see also: http://www.php-fig.org/psr/psr-4/)
│ └── Example
│ ├── Controller
│ │ ├── ActivityController.php …… アクティビティ系のリクエストを扱うコントローラ (ホーム画面も含まれる)
│ │ └── LoginController.php …… ログイン系のリクエストを扱うコントローラ
│ └── Repository
│ ├── Activity.php …… アクティビティ系のデータを操作するクラス
│ └── User.php …… ユーザ系のデータを操作するクラス
├── tests …… テスト (気にしてほしいけれども気にしなくてよい)
├── views …… テンプレートファイル群
│ ├── _base.twig …… 全ページ共通で読み込まれるテンプレートファイル
│ ├── home.twig …… ホーム画面のテンプレートファイル
│ └── login.twig …… ログイン画面のテンプレートファイル
└── web …… Web 公開用ディレクトリ
├── activity.js …… ホーム画面で表示されるアクティビティ関連のライブラリ
├── enquiry-form.php …… お問い合わせフォーム (このページだけなぜかわざとらしく素の PHP で書かれていて怪しいですね)
└── index.php …… すべてのリクエストの入り口となるフロントコントローラ
- すべてのリクエストは
web/index.phpで受けることになります。web/index.phpには受け付けるべきリクエストのパターン (リクエストメソッド、パス名) が定義されており、それぞれの定義に一致するリクエストであった場合は、あらかじめ決められたメソッドにリクエストを処理させます - たとえば
$app->get('/', 'controller.activity:home')は、GETメソッドで/に対してリクエストした場合に、controller.activity:homeにて表されるメソッドにその処理を担当させることになります。controller.activityはクラスを表し、:の後に続くhomeはそのクラスのインスタンスメソッド名と一致します。controller.activityおよびcontroller.loginがどのクラスであるかはconfig.phpに定義されており、それぞれExample\Controller\ActivityControllerとExample\Controller\LoginControllerとなります - したがって
GET / HTTP/1.1は$app->get('/', 'controller.activity:home')によって定義されたとおり、Example\Controller\ActivityControllerクラスのインスタンスのhome()メソッドによって処理されることになります - リクエスト契機で呼び出されるコントローラの各メソッドではレスポンスを返すことのみが決まっており、それ以外にどのような処理をおこなうのかは未定義 (各メソッドに委ねられている) ですが、主に以下のようなことをおこなっています
- リクエストパラメータに応じた任意の処理
- SQLite の DB 上のデータを操作 (
Example\Repository\UserやExample\Repository\Activityのメソッドによっておこなっています) - レスポンスボディとなるべき HTML を構築 (Twig によって
views/以下のテンプレートファイルを読み込むことによって実現しています。読み込むべきテンプレートファイル名は都度コントローラ側にて指定されています)