###### tags: `CakePHP`
CakePHP | セキュリティ対策
===
CakePHP Ver 3.8
## SQLインジェクション
デフォルトで防いでくれている。
[公式 | SQL インジェクションを防止する](https://book.cakephp.org/3/ja/orm/query-builder.html#id19)
## スクリプトインジェクション
FormHelper/HTMLHelper等のViewHelperを使用してHTMLを生成する場合はデフォルトでhtmlエスケープが施されて出力される。
しかし漏れが出そうなのでユーザー入力のデータをViewに含める際には全てh()※で囲う※htmlspecialcharactersのショートカット
## クロスサイトスクリプティング
同上
## クロスサイトリクエストフォージェリ
CakePHP3.8では、デフォルトでroutes.phpでCSRFミドルウェアが有効化されるようになっていた。
CSRFミドルウェアが有効な状態でFormヘルパーを使用しフォームを作成すると、自動的にCSRF_Tokenがフォームに含まれ、CSRF防御が有効化される。
```php
routes.php
$routes->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
'secure' => true
]));
//setCookieでhttpOnly secureがそれぞれ設定される。
//secure:https限定でcookieが送信される
//httpOnly:cookieの送信をjavascriptでできなくする。Ajaxでは送信できる。
$routes->applyMiddleware('csrf');
```
参考:[HTTP Cookie](https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies)
## セッションハイジャック
### セッションフィクセイション
CakePHP3は、ログイン時とログアウト時に自動でセッションIDを切り替える。
これにより、ユーザーがログイン前に固定化されたセッションを使用させられてしまった場合でも、ログイン後の状態には影響しない。
### ログイン前セッションフィクセイション
ログイン前にセッションを利用する場合に影響を受ける。
:::info
**例 Mochibeの場合**
ゲストユーザーとしてタスクの登録が行える。
その際にセッションでゲストユーザーのIDを管理しているため、ユーザーが固定化されたセッションを使用させられてしまった場合、攻撃者が登録されたタスクを閲覧・操作可能になる。
匿名ユーザーであり、閲覧されても許容できる範囲ではあるが、以下の対策をする。
**対策**
タスクの登録時にセッションIDを切り替える$session->renew()を呼ぶ。
:::
### セッションアダプション
サーバーで生成したセッションidしか使用しないようにする。
```
php.ini
session.use_strict_mode = 1
```
### その他セッションによる情報流出の対策
ログアウト処理でセッションを破棄する。
```php
logout処理で
$this->request->getSession()->destroy();
```
## パスワードのハッシュ化
ハッシュ化は一方通行なので復号化できないので万が一漏れても安全
saltは漏らさないように注意
以下のコードによりハッシュ化してデータベースに保存
```php
protected function _setPassword($password)
{
if (strlen($password) > 0) {
return (new DefaultPasswordHasher)->hash($password);
}
}
```
## キャッシュ制御不備
CDNやプロキシサーバーにユーザー情報を含んだキャッシュが残ることで他の人の画面に表示されてしまうことを防ぐ。
CakepHP3.8ではドキュメントには見つけられなかったがデフォルトで以下のHeaderが出力された。
```
Cache-Control: no-store, no-cache, must-revalidate
```
このままでも問題はないが、今後デフォルトの挙動が変更されてしまうと困るので全てのページにキャッシュしないよう明示的に指定しておく。
```php
in AppController
$response = $this->getResponse()->withDisabledCache();
$this->setResponse($response);
```
結果、以下の出力になった。
```
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
```