PHP フィルタ(Filter)

PHPのフィルタは、ユーザーの入力などの非安全なソースからのデータのバリデーションとフィルタリングに使用されます。

PHPのフィルタとは何ですか?

PHPのフィルタは、非安全なソースからのデータのバリデーションとフィルタリングに使用されます。

ユーザーやカスタムデータのバリデーションとフィルタリングは、どのウェブアプリケーションでも重要な部分です。

PHPのフィルタ拡張を設計したのは、データのフィルタリングをより簡単で迅速に行えるようにすることでした。

なぜフィルタを使用するのか?

ほとんどのウェブアプリケーションは外部からの入力に依存しています。これらのデータは通常、ユーザーや他のアプリケーション(例えばウェブサービス)から来ています。フィルタを使用することで、アプリケーションが正しい入力タイプを受け取れることを確実にできます。

常に外部データをフィルタリングすることをお勧めします!

入力フィルタリングは、アプリケーションセキュリティの重要なトピックの1つです。

外部データとは何ですか?

  • フォームからの入力データ
  • Cookies
  • サーバ変数
  • データベースクエリ結果

関数とフィルタ

変数をフィルタリングする場合は、以下のフィルタ関数のいずれかを使用してください:

  • filter_var() - 指定されたフィルタを使用して単一の変数をフィルタリングします
  • filter_var_array() - 同じまたは異なるフィルタを使用して複数の変数をフィルタリングします
  • filter_input - 1つの入力変数を取得し、フィルタリングします
  • filter_input_array - 複数の入力変数を取得し、同じまたは異なるフィルタを使用してフィルタリングします

以下の例では、filter_var()関数を使用して整数を検証しました:

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

上記のコードでは、"FILTER_VALIDATE_INT"フィルタを使用して変数をフィルタリングしています。この整数が有効であるため、コードの出力は"整数は有効です"です。

非整数の変数を使用しようとすると、出力は次のようになります:"整数は無効です"。

完全な関数とフィルタリストについては、私たちの PHP フィルタ参照マニュアル

ValidatingとSanitizing

フィルタには2種類あります:

Validating フィルタ:

  • ユーザー入力の検証に使用されます
  • 厳格なフォーマットルール(例えば、URLやE-Mailの検証)
  • 成功した場合、期待されるタイプを返し、失敗した場合 FALSEを返します

Sanitizing フィルタ:

  • 指定された文字列内の文字の許可または禁止に使用されます
  • データフォーマットのルールがありません
  • 常に文字列を返します

オプションとフラグ

オプションとフラグは、指定されたフィルタに追加のフィルタオプションを追加するために使用されます。

異なるフィルタには異なるオプションとフラグがあります。

以下の例では、filter_var()と"min_range"および"max_range"オプションを使用して整数を検証しました:

<?php
$var=300;
$int_options = array(
"options"=>array
 (
 "min_range"=>0,
 "max_range"=>256
 )
);
if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
 {
 echo("整数は無効です");
 }
else
 {
 echo("整数は有効です");
 }
?>

上記のコードと同様に、オプションは「options」と呼ばれる関連配列に記入する必要があります。フラグを使用する場合は、配列内に記入する必要はありません。

整数が「300」であるため、指定された範囲外にあり、上記のコードの输出は「Integer is not valid」になります。

完全な関数およびフィルタリストについては、CodeW3C.com で提供されています。 PHP フィルタ参照マニュアル。各フィルタの利用可能なオプションとフラグが見られます。

入力の確認

フォームから送信された入力を確認してみましょう。

最初に確認する必要があるのは、検索している入力データが存在するかです。

その後、filter_input() 関数を使って入力データをフィルタリングします。

以下の例では、入力変数「email」が PHP ページに送信されます:

<?php
if(!filter_has_var(INPUT_GET, "email"))
 {
 echo("Input type does not exist");
 }
else
 {
 if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
  {
  echo "E-Mail is not valid";
  }
 else
  {
  echo "E-Mail is valid";
  }
 }
?>

例解:

上の例では、「GET」メソッドで送信された入力変数(email)があります:

  1. 「GET」タイプの「email」入力変数が存在するかを検出します
  2. 入力変数が存在する場合、それが有効なメールアドレスであるかを検出します

入力の净化

フォームから送信された URL を清理してみましょう。

まず、検索している入力データが存在するか確認する必要があります。

その後、filter_input() 関数を使って入力データを净化します。

以下の例では、入力変数「url」が PHP ページに送信されます:

<?php
if(!filter_has_var(INPUT_POST, "url"))
 {
 echo("Input type does not exist");
 }
else
 {
 $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL);
 }
?>

例解:

上の例では、「POST」メソッドで送信された入力変数(url)があります:

  1. 「POST」タイプの「url」入力変数が存在するかを検出します
  2. 存在する場合、この入力変数を净化(不正な文字の削除)し、$url 変数に保存します

もし入力変数がこんな感じであれば:"http://www.W3非o法ol.com.c字符n/"、那么净化后的 $url 変数应该是这样的:

http://www.codew3c.com/

複数の入力をフィルタリング

フォームは通常、複数の入力フィールドで構成されています。filter_varやfilter_inputに複数回呼び出すことを避けるために、filter_var_arrayやfilter_input_array関数を使用できます。

この例では、filter_input_array()関数を使用して3つのGET変数をフィルタリングします。受け取ったGET変数は、名前、年齢、メールアドレスです:

<?php
$filters = array
 (
 "name" => array
  (
  "filter"=>FILTER_SANITIZE_STRING
  ),
 "age" => array
  (
  "filter"=>FILTER_VALIDATE_INT,
  "options"=>array
   (
   "min_range"=>1,
   "max_range"=>120
   )
  ),
 "email"=> FILTER_VALIDATE_EMAIL,
 );
$result = filter_input_array(INPUT_GET, $filters);
if (!$result["age"])
 {
 echo("Age must be a number between 1 and 120.<br />");
 }
elseif(!$result["email"])
 {
 echo("E-Mail is not valid.<br />");
 }
else
 {
 echo("User input is valid");
 }
?>

例解:

上の例では、"GET"メソッドで送信された3つの入力変数(name、ageおよびemail)があります。

  1. 入力変数の名前と指定された入力変数のフィルタを含む配列を設定します。
  2. filter_input_array関数を呼び出し、引数にはGET入力変数と先に設定した配列が含まれます。
  3. $result変数の"age"と"email"変数が不正な入力があるかどうかを確認します。(不正な入力があれば、)

filter_input_array()関数の第2引数は配列または単一のフィルタのIDです。

このパラメータが単一のフィルタのIDである場合、指定されたフィルタは入力配列中のすべての値をフィルタリングします。

このパラメータが配列である場合、この配列は以下のルールに従う必要があります:

  • これは関連配列でなければなりません。その中には、配列のキー(例えば「age」入力変数)としての入力変数を含む必要があります
  • この配列の値は、フィルタの ID またはフィルタ、フラグおよびオプションを指定する配列でなければなりません

Filter Callback

FILTER_CALLBACK フィルタを使用して、カスタム関数を呼び出し、フィルタとして使用することができます。これにより、データフィルタリングの完全な制御権を得ることができます。

カスタム関数を作成することもできますし、既存の PHP 関数を使用することもできます。

フィルタ関数を使用する方法は、オプションを指定する方法と同様です。

以下の例では、すべての「_」をスペースに変換するためにカスタム関数を使用しています:

<?php
function convertSpace($string)
{
return str_replace("_", " ", $string);
}
$string = "Peter_is_a_great_guy!";
echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));
?>

上記のコードの結果は以下のようになります:

Peter は素晴らしい人です!

例解:

上記の例では、すべての「_」をスペースに変換しています:

  1. 「_」をスペースに置き換える関数を作成します
  2. filter_var() 関数を呼び出し、その引数は FILTER_CALLBACK フィルタおよび私たちの関数を含む配列です