なぜPHPアプリにセキュリティホールが多いのか?
【スクリプトインジェクション対策07】予期しないエラーが発生した場合,プログラムの実行を停止する
ユーザ入力の単純エラー,例えば必須項目の記入漏れなどであれば,エラーでプログラムの実行を停止するのではなく記入漏れなどのエラーが発生したことを画面に表示するようにします。しかし,不正な文字エンコーディングやシステムが設定しているパラメータの改ざんなど不正な入力の場合はプログラムの実行を停止すべきです。
不正な入力を処理可能な値にフィルタ処理を行い,プログラムの実行を継続するのは予想もしない問題の原因となるので危険です。一般的なサニタイズ処理ではデータを修正して処理を継続するコードになっています。入力処理にはサニタイズ処理は行わず,バリデーション(検証)処理を行いエラーを検出し,エラー時にはプログラムの実行を停止させます。
正常な状態であればPHPのエラーイベントはまったく発生しないようにコーディングすべきです。正常な状態でエラーが発生しないようにコーディングされたプログラムでエラーが発生するのは,何らかの異常なデータなどが原因でエラーが発生した,と仮定できます。プログラムロジック中であってもエラーが発生した場合,エラーを回復するのではなくプログラムの実行を停止してしまうほうが安全です。
PHPは,ファイル,ネットワーク接続,データベース接続,共有メモリなどリソースはPHP本体が管理しています。PHPがWebサーバのモジュールとして動作していても何時でもプログラムの実行を停止できます。出力バッファを利用すれば既に送信したヘッダやコンテンツもクリアすることができます。出力バッファを使用すればテンプレートの出力中のエラーでもプログラムの実行を中止し,適切なエラーページを表示できます。
エラー発生時にプログラムの実行を停止させるには,ユーザ定義エラーハンドラ/ユーザ定義例外ハンドラの利用が便利です。
対策のまとめ
- 通常の処理(正常な入力)ではエラーが発生しないようなコーディングを行う
- ユーザの入力ミス(電話番号の入力ミス,必須項目の記入漏れなど)以外はすべて致命的なエラーとして取り扱う
- エラーが発生した場合はプログラムの実行を停止する
- アプリケーション全体で対策できるよう例外/エラーハンドラを定義する
- エラー発生時に適切なエラーページが表示できるよう出力バッファを活用する
補講
- 【スクリプトインジェクション対策19】ユーザを教育する
- 【スクリプトインジェクション対策18】ログイン処理を正しく実装する
- 【スクリプトインジェクション対策17】パスワードを正しく管理する
- 【スクリプトインジェクション対策16】関連するサイトが利用しているドメイン名の一覧を提供する
- 【スクリプトインジェクション対策15】JavaScriptが無効なクライアントでも利用可能なサイトにする
- 【スクリプトインジェクション対策14】HTML,CSS,JavaScriptの生成はホワイトリスト方式を利用する
- 【スクリプトインジェクション対策13】不正な文字データを保存できないようにする
- 【スクリプトインジェクション対策12】データベースなど,内部データを信用しない
- 【スクリプトインジェクション対策11】エスケープしてはならないデータ以外はすべてエスケープする
- 【スクリプトインジェクション対策10】すべての入力値を可能な限り厳しい条件で検証する
-
Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?
本書は,Webサイトのセキュリティ確保のために必要な基礎知識と,安全なコードを書くために必要な基礎知識を解説しています。Webアプリケーションは比較的簡単に作成で...
-
はじめてのPHP言語プログラミング入門
Webアプリケーション構築ツールとしてPHPを取り上げた書籍は数多くありますが,言語の解説・入門書としての書籍はあまりありません。 本書は,プログラミング言語として...

