なぜPHPアプリにセキュリティホールが多いのか?
【スクリプトインジェクション対策11】エスケープしてはならないデータ以外はすべてエスケープする
この記事を読むのに必要な時間:およそ 0.5 分
Webシステムに限らず,エスケープ処理はセキュリティ対策の基本です。すべての外部システムへの出力は,出力先の外部システムが誤作動しないよう適切にエスケープしてから出力しなければなりません。
Webアプリケーションにおけるエスケープ処理というとHTMLとSQLのエスケープ処理が例として挙げられますが,それは一部にしかすぎません。
Webアプリケーションから見た外部システムの一例
- ブラウザ
- ブラウザのプラグイン
- ブラウザのスクリプト実行環境
- データベース
- メールサーバ
- Webサービス
- ディレクトリサーバ
- ファイルシステム
- コマンド実行環境
- 外部システムによって処理されるすべてのファイル(XMLファイル,YAMLファイルなど)
- ライブラリ関数
エスケープ処理が必要なデータだけエスケープするのではなく,エスケープしてはならないデータ以外はすべてエスケープするようにします。よく見かける間違いはデータベースに保存されたデータ,セッション配列のデータ等,一度システムに取り入れられたことがあるデータを盲目的に信用してエスケープ処理を行わないコードです。このようなコードは間接な攻撃によりプログラマが意図しない不正な処理を可能にしてしまう場合があります。
エスケープを行わない(エスケープが行えない)データは,そのデータの起源や管理状態にまでさかのぼって検証しなければなりません。この作業は容易なことではありません。エスケープしても構わないデータすべてをエスケープすることによって,システムの安全性も向上し,検証作業も軽減でき,メンテナンス性も向上します。
対策のまとめ
- 外部システムの入力および出力仕様を正しく習得する
- ブラウザの場合,仕様通りの入力/出力仕様を期待しない(保守的に対処する)
- エスケープが必要な場合,デフォルトで「すべて」エスケープする
- エスケープできないデータはデータのソースから出力形式まで完全に安全であることを確認する
- 正しい文字エンコーディングであることも必ず確認する
- 不正なデータを見つけた場合,基本的にエラーとして処理し,不正なデータを除去(削除/サニタイズ)して処理を継続しない
補講
- 【スクリプトインジェクション対策19】ユーザを教育する
- 【スクリプトインジェクション対策18】ログイン処理を正しく実装する
- 【スクリプトインジェクション対策17】パスワードを正しく管理する
- 【スクリプトインジェクション対策16】関連するサイトが利用しているドメイン名の一覧を提供する
- 【スクリプトインジェクション対策15】JavaScriptが無効なクライアントでも利用可能なサイトにする
- 【スクリプトインジェクション対策14】HTML,CSS,JavaScriptの生成はホワイトリスト方式を利用する
- 【スクリプトインジェクション対策13】不正な文字データを保存できないようにする
- 【スクリプトインジェクション対策12】データベースなど,内部データを信用しない
- 【スクリプトインジェクション対策11】エスケープしてはならないデータ以外はすべてエスケープする
- 【スクリプトインジェクション対策10】すべての入力値を可能な限り厳しい条件で検証する
-
Webアプリセキュリティ対策入門〜あなたのサイトは大丈夫?
本書は,Webサイトのセキュリティ確保のために必要な基礎知識と,安全なコードを書くために必要な基礎知識を解説しています。Webアプリケーションは比較的簡単に作成で...
-
はじめてのPHP言語プログラミング入門
Webアプリケーション構築ツールとしてPHPを取り上げた書籍は数多くありますが,言語の解説・入門書としての書籍はあまりありません。 本書は,プログラミング言語として...

