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

【スクリプトインジェクション対策11】エスケープしてはならないデータ以外はすべてエスケープする

Webシステムに限らず、エスケープ処理はセキュリティ対策の基本です。すべての外部システムへの出力は、出力先の外部システムが誤作動しないよう適切にエスケープしてから出力しなければなりません。

Webアプリケーションにおけるエスケープ処理というとHTMLとSQLのエスケープ処理が例として挙げられますが、それは一部にしかすぎません。

Webアプリケーションから見た外部システムの一例

  • ブラウザ
  • ブラウザのプラグイン
  • ブラウザのスクリプト実行環境
  • データベース
  • メールサーバ
  • Webサービス
  • ディレクトリサーバ
  • ファイルシステム
  • コマンド実行環境
  • 外部システムによって処理されるすべてのファイル(XMLファイル、YAMLファイルなど)
  • ライブラリ関数

エスケープ処理が必要なデータだけエスケープするのではなく、エスケープしてはならないデータ以外はすべてエスケープするようにします。よく見かける間違いはデータベースに保存されたデータ、セッション配列のデータ等、一度システムに取り入れられたことがあるデータを盲目的に信用してエスケープ処理を行わないコードです。このようなコードは間接な攻撃によりプログラマが意図しない不正な処理を可能にしてしまう場合があります。

エスケープを行わない(エスケープが行えない)データは、そのデータの起源や管理状態にまでさかのぼって検証しなければなりません。この作業は容易なことではありません。エスケープしても構わないデータすべてをエスケープすることによって、システムの安全性も向上し、検証作業も軽減でき、メンテナンス性も向上します。

対策のまとめ

  • 外部システムの入力および出力仕様を正しく習得する
  • ブラウザの場合、仕様通りの入力/出力仕様を期待しない(保守的に対処する)
  • エスケープが必要な場合、デフォルトで「すべて」エスケープする
  • エスケープできないデータはデータのソースから出力形式まで完全に安全であることを確認する
  • 正しい文字エンコーディングであることも必ず確認する
  • 不正なデータを見つけた場合、基本的にエラーとして処理し、不正なデータを除去(削除/サニタイズ)して処理を継続しない

おすすめ記事

記事・ニュース一覧