menu
ホーム > PHPセキュリティー > 3 フィルタリング > 3-1 フィルタリング [PHPセキュリティー]
UPDATE:2017年08月09日

3-1 フィルタリング [PHPセキュリティー]

PHPセキュリティ


フィルタリングとは

POINT

  • フィルタとはデータを期待した内容に強制すること
  • フィルタはセキュリティーの要
  • すべての入力データにフィルタを行う

フィルタとは汚染リスクのあるデータを期待した内容に強制し信頼できるデータにすることです

例えば、HTMLフォームに電話番号入力欄があるとします。開発者はこの textarea に半角数値を期待しているとします。ですが、ユーザーは全角数値を入力するかもしれません。あるいは、悪意のあるjavascriptコードを入力するかもしれません。ユーザーが意図するしないに関わらず、そのようなデータが入力され送信された場合、PHPでは受け付けないように処理する必要があります。「半角数値のみ有効」という処理を行うことで、期待したデータへ強制させる必要があります。

フィルタは非常に大切であり、セキュリティーの要となります。フィルタはデータの発信元の如何を問わず、すべての入力データに対して行いましょう。そうすることで、データの汚染リスクを排除することが出来ます。フィルタされたデータのみを使えば、多くの脆弱性からアプリケーションを守ることが出来ます。

では、どのようなデータが汚染リスクのある入力データなのか、また、入力データをどのようにフィルタするのか、以下で具体的に紹介したいと思います。


入力フィルタの三段階

POINT 入力フィルタの三段階

  • 入力の識別
  • 入力フィルタ
  • フィルタされたデータと汚染リスクがあるデータの区別

最初に入力を識別する必要があります。どのデータがどのから来た入力データなのかを識別しましょう。そして入力と識別されたデータを適切にフィルタ処理して汚染リスクを排除します。最後に、フィルタしたクリーンなデータとそうでないデータを区別して、混同しないようにしましょう。せっかく入力データをフィルタ処理してクリーンなデータを作っても、誤って汚染リスクのあるデータを使用してしまっては元も子もありませんからね。


入力の識別

POINT

  • 入力の識別
  • 入力とはリモートソースを起源とするデータのこと
  • リモートソースとはhttpクライアント、データベース、セッションコンテナなど

入力とはリモートソースを起源とする任意のデータのことです。リモートソースとは、httpクライアントデータベースセッションデータコンテナRSSフィードAPIなどで取得したデータ、などのことです。PHP自身で作成したデータ以外はすべて入力データとなります

入力の識別とは、上記したリモートソースを追跡して、データがどこから来たのかどこに保存されているのか、を識別することです。

ブラウザから送信されてきたデータ、URLから送信されてきたデータ、データベースに保存されているデータ、セッションデータコンテナに保存されているデータ、このようにそのデータがどこを起源とするデータであるのかを識別することが、入力の識別です。

入力データ

POINT

  • 入力データとは、HTMLフォーム、URL、クッキーなどhttpクライアントから送信されるデータ、データベースやセッションコンテナから取得したデータ、RSSやAPIから取得したデータ、これらリモートソースを起源とするデータのこと
  • 入力データはPHP自身で作成したデータ以外すべて

HTMLフォームやURL等から渡されてくるデータ $_POST や $_GETなど、あるいは、クッキーから渡されてくるデータ $_COOKIE、データベースから取得したデータ、セッションコンテナから取得したデータ $_SESSION、これらすべては入力データデータであり、汚染されている可能性があります。
つまり、入力データとはアプリケーション自身で作成したデータ以外のことです。リモートソースを起源とするデータです。

入力データ

PHP自身で作成したデータ


入力のフィルタ

POINT

  • 入力のフィルタで不正なデータを検出する
  • ホワイトリスト方式
  • フィルタでデータの修正をしない

入力のフィルタは、サニタイズ、バリデート、クリーニング、スクラッブなどといいます。動的な文字列などは正規表現でフィルタを行います。正規表現で入力データをチェックする場合は、しっかりと検証して不正なデータを検出できることを確実にしましょう。正規表現の例はこちらを参照下さい

フィルタはホワイトリスト方式を利用しましょう。ホワイトリスト方式とは、「データが有効である」条件を定義して、その条件を満たさないデータはすべて無効にする方式のことです。

フィルタは入力データをチェックする機能のみとして、フィルタで無効なデータを修正しないようにしましょう。修正処理にミスがある場合は新たな脆弱性が発生することになります。

正規表現の例

結果は

すべて ひらがな
すべて ひらがな
すべて 数値

となります。

フォームからのデータをフィルタする

input.php 入力フォーム

check.php フィルタ


フィルタはホワイトリスト方式

POINT

  • フィルタはホワイトリスト方式を利用する

フィルタはホワイトリスト方式を利用しましょう。ホワイトリスト方式とは、「データが有効である」条件を定義して、その条件を満たさないデータはすべて無効にする方式のことです。以下にホワイトリスト方式を利用したフィルタ処理を紹介します。

フィルタの例

下記の例では、有効である場合に限り初期化した変数$capitalCityへ入力データ$_POST[‘capitalCity’]を代入しています。代入されなければ、初期化した変数$capitalCityが出力されるだけなので安全です。

結果は

ホワイトリスト方式
$capitalCity:Tokyo
ホワイトリスト方式
$capitalCity:

となります。


フィルタで無効なデータを修正しない

POINT

  • フィルタで無効なデータを修正しない

フィルタは入力データをチェックする機能のみとして、フィルタで無効なデータを修正しないようにしましょう。修正処理にミスがある場合は新たな脆弱性が発生することになります。


フィルタされたデータと汚染リスクがあるデータの区別

POINT

  • 初期化した変数へフィルタしたデータを代入

フィルタされたデータを汚染リスクのない初期化した変数に代入してしっかりと区別しましょう。

初期化した変数へフィルタ後のデータを格納する

変数の初期化


タグ(=記事関連ワード)

日付

投稿日:2017年8月6日
最終更新日:2017年08月09日

関連記事

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

http://wepicks.net/phpsecurity-filtering/trackback/

page top