なぜPHPアプリにセキュリティホールが多いのか?

【スクリプトインジェクション対策07】予期しないエラーが発生した場合、プログラムの実行を停止する

ユーザ入力の単純エラー、例えば必須項目の記入漏れなどであれば、エラーでプログラムの実行を停止するのではなく記入漏れなどのエラーが発生したことを画面に表示するようにします。しかし、不正な文字エンコーディングやシステムが設定しているパラメータの改ざんなど不正な入力の場合はプログラムの実行を停止すべきです。

不正な入力を処理可能な値にフィルタ処理を行い、プログラムの実行を継続するのは予想もしない問題の原因となるので危険です。一般的なサニタイズ処理ではデータを修正して処理を継続するコードになっています。入力処理にはサニタイズ処理は行わず、バリデーション(検証)処理を行いエラーを検出し、エラー時にはプログラムの実行を停止させます。

正常な状態であればPHPのエラーイベントはまったく発生しないようにコーディングすべきです。正常な状態でエラーが発生しないようにコーディングされたプログラムでエラーが発生するのは、何らかの異常なデータなどが原因でエラーが発生した、と仮定できます。プログラムロジック中であってもエラーが発生した場合、エラーを回復するのではなくプログラムの実行を停止してしまうほうが安全です。

PHPは、ファイル、ネットワーク接続、データベース接続、共有メモリなどリソースはPHP本体が管理しています。PHPがWebサーバのモジュールとして動作していても何時でもプログラムの実行を停止できます。出力バッファを利用すれば既に送信したヘッダやコンテンツもクリアすることができます。出力バッファを使用すればテンプレートの出力中のエラーでもプログラムの実行を中止し、適切なエラーページを表示できます。

エラー発生時にプログラムの実行を停止させるには、ユーザ定義エラーハンドラ/ユーザ定義例外ハンドラの利用が便利です。

対策のまとめ

  • 通常の処理(正常な入力)ではエラーが発生しないようなコーディングを行う
  • ユーザの入力ミス(電話番号の入力ミス、必須項目の記入漏れなど)以外はすべて致命的なエラーとして取り扱う
  • エラーが発生した場合はプログラムの実行を停止する
  • アプリケーション全体で対策できるよう例外/エラーハンドラを定義する
  • エラー発生時に適切なエラーページが表示できるよう出力バッファを活用する

おすすめ記事

記事・ニュース一覧