ネットワークのセキュリティ対策で最も重要な部分は、「入力検査」(バリデーション) 「出力制御」(エスケープ、ヘルパー関数、バリデーション)、そして正しい「ロジック」である。
- 全ての入力を出来るだけ早い時点で確認する
- 許可する入力を確認する(ホワイトリスト方式、警戒する必要のない対象の一覧表)
- 許可する文字列の長さを確認する
- 文字エンコーディングを確認する
- 許可する文字種を確認する(特にヌル文字、改行などの特殊文字)
- 許可する形式を確認する
- 正規表現を使わずに文字種、形式の確認が出来る場合は利用しない
- ホワイトリスト方式による確認が現実的でない場合にのみ、ブラックリスト方式で確認する
- 通常の場合、クライアントから不正な文字列が送信されないと仮定できる場合、不正な文字列を検出した場合、少なくともエラーログを記録し、プログラムの実行を停止する
PHPにおいては、完全な入力検査に完全に従っているPHPアプリケーションは多くない。
とくに1は、入力検査に引っかかったらすぐに処理を停止しないといけない。
入力検査を処理の最後にやっても全く意味がないよ。
出来る入力検査はすべてやらないといけないね。
その上で、テストも漏れのないよう網羅してやらないといけませんね。