PHP アドバンス

PHP フィルタ

1. PHP フィルタ拡張機能 (The PHP Filter Extension)

PHP フィルタは、安全でない外部入力(フォームからのユーザー入力、クッキー、Webサービス、データベースクエリなど)をバリデーション(検証)およびサニタイズ(浄化)するために使用されます。

  • データのバリデーション(検証): データが適切な形式(有効なメールアドレス、URL、整数など)であるかを確認します。
  • データのサニタイズ(浄化): データから不正な文字を除去します。

外部データは常にバリデーションを行う必要があります。
不適切に送信されたデータはセキュリティ上の問題を引き起こし、Webページを壊す原因となります。PHP フィルタを使用することで、アプリケーションが正しい入力を受け取っていることを確実に保証できます。

2. PHP フィルタ関数

PHP フィルタ拡張機能にはユーザー入力をチェックするための多くの関数が用意されており、データの検証をより簡単かつ迅速に行えるよう設計されています。

  • filter_var() - 指定されたフィルタで単一の変数をフィルタリングします。
  • filter_input() - 外部変数(フォーム入力など)を取得し、フィルタリングします。
  • filter_var_array() - 複数の外部変数(配列)を取得し、フィルタリングします。
  • filter_list() - サポートされているすべてのフィルタ名とIDをリスト表示します。

3. PHP filter_list() 関数

filter_list() 関数は、サポートされているすべてのフィルタ名とそのIDをリストするために使用されます。

以下の例では、サポートされているフィルタ名とIDをHTMLテーブルで表示します。

<table>
  <tr>
    <th>フィルタ名 (Filter Name)</th>
    <th>フィルタID (Filter ID)</th>
  </tr>
  <?php
  foreach (filter_list() as $id => $filter) {
    // フィルタ名とそのIDを取得して表示
    echo '<tr><td>' . $filter . '</td><td>' . filter_id($filter) . '</td></tr>';
  }
  ?>
</table>

4. PHP filter_var() 関数

filter_var() 関数は、指定されたフィルタを使用して単一の変数をフィルタリングします。

4.1 構文

filter_var(var, filter, options);

パラメータ:

  • var - 必須。フィルタリングする変数を指定します。
  • filter - 任意。使用するフィルタのIDまたは名前を指定します。
  • options - 任意。使用する1つ以上のフラグ/オプションを指定します。

5. PHP フィルタの種類

PHPには、主に2種類のフィルタがあります。

5.1 バリデーションフィルタ (Validation filters)

データが特定の基準を満たしているかを確認しますが、データ自体は変更しません。データが無効な場合は false を返します。

バリデーションフィルタの例:

  • FILTER_VALIDATE_EMAIL
  • FILTER_VALIDATE_URL
  • FILTER_VALIDATE_INT
  • FILTER_VALIDATE_IP

5.2 サニタイズフィルタ (Sanitization filters)

データから不正な文字を除去し、入力を変更する場合があります。

サニタイズフィルタの例:

  • FILTER_SANITIZE_EMAIL(メールアドレスとして不正な文字を除去)
  • FILTER_SANITIZE_URL(URLとして不正な文字を除去)
  • FILTER_SANITIZE_NUMBER_INT(数字および + - 記号以外のすべての文字を除去)

すべてのフィルタの詳細については、PHP Filter Referenceを参照してください。

6. メールアドレスのサニタイズとバリデーション

以下の例では、filter_var() 関数を使用して、まず $email 変数からすべての不正な文字を除去し、次にそれが有効なメールアドレスであるかを確認します。

<?php
$email = "[email protected]";

// メールアドレスから不正な文字を除去
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// メールアドレスをバリデーション
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
  echo("$email は有効なメールアドレスです");
} else {
  echo("$email は無効なメールアドレスです");
}
?>

7. URLのサニタイズとバリデーション

以下の例では、filter_var() 関数を使用して、まずURLからすべての不正な文字を除去し、次に $url が有効なURLであるかを確認します。

<?php
$url = "https://www.volardev.com";

// URLから不正な文字を除去
$url = filter_var($url, FILTER_SANITIZE_URL);

// URLをバリデーション
if (!filter_var($url, FILTER_VALIDATE_URL) === false) {
  echo("$url は有効なURLです");
} else {
  echo("$url は無効なURLです");
}
?>

8. 整数のバリデーション

以下の例では、filter_var() 関数を使用して変数 $int が整数であるかを確認します。$int が整数の場合、出力は「整数は有効です(Integer is valid)」となります。整数でない場合、出力は「整数は無効です(Integer is not valid)」となります。

<?php
$int = 100;

if (!filter_var($int, FILTER_VALIDATE_INT) === false) {
  echo("整数は有効です");
} else {
  echo("整数は無効です");
}
?>

8.1 filter_var() と「0」の問題

上記の例において、もし $int0 に設定されていた場合、関数は「整数は無効です」を返してしまいます。この問題を解決するには、以下のコードを使用してください。

<?php
$int = 0;

// 値が0であるか、または有効な整数であるかをチェック
if (filter_var($int, FILTER_VALIDATE_INT) === 0 || !filter_var($int, FILTER_VALIDATE_INT) === false) {
  echo("整数は有効です");
} else {
  echo("整数は無効です");
}
?>

9. IPアドレスのバリデーション

以下の例では、filter_var() 関数を使用して変数 $ip が有効なIPアドレスであるかを確認します。

<?php
$ip = "127.0.0.1";

if (!filter_var($ip, FILTER_VALIDATE_IP) === false) {
  echo("$ip は有効なIPアドレスです");
} else {
  echo("$ip は無効なIPアドレスです");
}
?>