PHP 開発の基本チュートリアル - フィルター
1. PHP フィルターとは何ですか?
PHP フィルターは、ユーザー入力などの安全でないソースからのデータを検証およびフィルターするために使用されます。
ユーザー入力またはカスタム データのテスト、検証、フィルタリングは、Web アプリケーションの重要な部分です。
PHP のフィルター拡張機能は、データのフィルター処理を簡単かつ高速にするように設計されています。
2. フィルターを使用する理由は何ですか?
ほぼすべての Web アプリケーションは外部入力に依存しています。通常、このデータはユーザーまたは他のアプリケーション (Web サービスなど) から取得されます。フィルターを使用すると、アプリケーションが正しい入力タイプを取得できるようになります。
外部データは常にフィルタリングする必要があります。
入力フィルタリングは、アプリケーションのセキュリティの最も重要なトピックの 1 つです。
外部データとは何ですか?
フォームからの入力データ
Cookie
Webサービスデータ
サーバー変数
データベースクエリ結果
3. 関数とフィルター
へ変数をフィルターするには、次のフィルター関数のいずれかを使用します:
filter_var() - 指定したフィルターで単一の変数をフィルターします
filter_var_array() - 同じまたは異なるフィルターでフィルターして複数の変数をフィルターします
filter_input - 入力変数を取得してフィルターします
filter_input_array - 複数の入力変数を取得して、同じまたは異なるフィルターでフィルターします
次の例では、filter_var() 関数を使用して整数を検証します。は次のとおりです
<?php $int = 12443633; //验证一个数是不是整数 if(!filter_var($int, FILTER_VALIDATE_INT)) { echo("不是一个合法的整数"); } else { echo("是个合法的整数"); } ?>
出力は右側に表示されます
注: 出力結果を観察するために他の変数を試すことができます
IV. 検証とサニタイジングがあります
- ユーザー入力の検証に使用
- 厳密な書式設定ルール (URL や電子メールの検証など)
- 成功した場合は予期されたタイプを返し、失敗した場合は FALSE を返します
- 文字列内の指定された文字を許可または禁止するために使用されます
- データ形式の規則はありません
- 常に返される文字列
5. オプションとフラグ オプションとフラグは、指定されたフィルターに追加のフィルター オプションを追加するために使用されます。
異なるフィルターには異なるオプションとフラグがあります。
以下の例では、「min_range」オプションと「max_range」オプションを指定した filter_var() を使用して整数を検証します。
コードは次のとおりです
<?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」であり、指定された範囲内にないため、上記のコードの出力は次のようになります:
は有効な整数ではありません
関数とフィルターの完全なリストについては、 PHP マニュアル
6. 入力の検証
フォームからの入力を検証してみましょう。
最初に行う必要があるのは、探している入力データが存在することを確認することです。
次に、filter_input() 関数を使用して入力データをフィルターします。
以下の例では、入力変数「email」が PHP ページに渡されます:
<?php if(!filter_has_var(INPUT_GET, "email")) { echo("没有 email 参数"); } else { if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) { echo "不是一个合法的 E-Mail"; } else { echo "是一个合法的 E-Mail"; } } ?>
上の例では、入力変数 (email) が「GET」メソッドを介して渡されます:
"GET" "email" 型の入力変数
入力変数が存在する場合は、それが有効なメールアドレスかどうかを確認します
7. 入力を精製します
クリーンアップしてみましょうフォームから渡されたデータ 次の URL。
まず、探している入力データが存在することを確認します。
次に、filter_input() 関数を使用して入力データを精製します。
次の例では、入力変数「url」が PHP ページに渡されます:
<?php if(!filter_has_var(INPUT_GET, "url")) { echo("没有 url 参数"); } else { $url = filter_input(INPUT_GET, "url", FILTER_SANITIZE_URL); echo $url; } ?>
例の説明:
上記の例では、入力変数 (url) が「GET」メソッドを通じて渡されます。
タイプ「GET」の「url」入力変数があるかどうかの検出
この入力変数が存在する場合は、それを精製(不正な文字を削除)し、$url 変数に格納します
8 複数の入力をフィルタリングします。
フォームは通常、複数の入力フィールドで構成されます。 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("年龄必须在 1 到 120 之间。<br>"); } elseif(!$result["email"]) { echo("E-Mail 不合法<br>"); } else { echo("输入正确"); } ?>
例の説明
上記の例には、3 つの入力変数 (名前、年齢、電子メール) があります。
入力変数の名前と指定された入力変数のフィルターを含む配列を設定します
filter_input_array() 関数を呼び出します。パラメータには GET 入力変数と設定したばかりの配列が含まれます
$result 変数の "age" 変数と "email" 変数に不正な入力がないか確認してください。 (不正な入力がある場合、filter_input_array() 関数を使用した後の入力変数は FALSE になります。)
filter_input_array() 関数の 2 番目のパラメーターには、配列または単一フィルターの ID を指定できます。
パラメーターが単一フィルターの ID の場合、指定されたフィルターは入力配列内のすべての値をフィルター処理します。
パラメータが配列の場合、配列は次の規則に従う必要があります:
連想配列である必要があり、それに含まれる入力変数が配列のキーになります(「年齢」入力変数など)
この配列の値は、フィルターの ID、またはフィルター、フラグ、オプションを指定する配列である必要があります
9. フィルター コールバックの使用
FILTER_CALLBACK フィルターを使用すると、カスタム関数を呼び出して使用できます。フィルターデバイスとして使用します。このようにして、データのフィルタリングを完全に制御できます。
独自のカスタム関数を作成することも、既存の PHP 関数を使用することもできます。
指定されたオプションに従って、使用するフィルター関数を指定します。 「options」という名前の連想配列内。
次の例では、カスタム関数を使用してすべての「_」をスペースに変換します:
<?php function convertSpace($string) { return str_replace("_", ".", $string); } $string = "www_php_cn!"; echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace")); ?>
出力結果は右の図に示されています
例の説明
上記の例はすべてを変換します"_" を "." に変更します:
"_" を "." に置き換える関数を作成します
パラメーターが FILTER_CALLBACK フィルターと関数を含む配列である filter_var() 関数を呼び出します