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

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

この記事を読むのに必要な時間:およそ 0.5 分

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

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

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

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

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

対策のまとめ

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

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書

コメント

コメントの記入