PHPフィルター
PHP フィルターは、ユーザー入力などの安全でないソースからのデータを検証およびフィルターするために使用されます。
PHPフィルターとは何ですか?
PHP フィルターは、安全でないソースからのデータを検証およびフィルターするために使用されます。
ユーザー入力またはカスタム データのテスト、検証、フィルタリングは、Web アプリケーションの重要な部分です。
PHP のフィルター拡張機(jī)能は、データのフィルター処理を簡単かつ高速にするように設(shè)計(jì)されています。
なぜフィルターを使用するのですか?
ほとんどすべての Web アプリケーションは外部入力に依存しています。このデータは通常、ユーザーまたは他のアプリケーション (Web サービスなど) から取得されます。フィルターを使用すると、アプリケーションが正しい入力タイプを取得できるようになります。
外部データは常にフィルタリングする必要があります。
入力フィルタリングは、アプリケーションのセキュリティに関する最も重要なトピックの 1 つです。
外部データとは何ですか?
?フォームからの入力データ
?Cookie
?Webサービスデータ
?サーバー変數(shù)
?データベースクエリ結(jié)果
関數(shù)とフィルター
変數(shù)をフィルターするには、次を使用します次のフィルター関數(shù)のいずれか:
?filter_var
() - 指定されたフィルターで単一の変數(shù)をフィルターします? filter_var_array
() - 同じまたは異なるフィルターでフィルターして複數(shù)の変數(shù)をフィルターします? filter_input
- 入力変數(shù)を取得してフィルターします· filter_input_array
- 複數(shù)の入力変數(shù)を取得して、同じまたは異なるフィルターでフィルターします例
で次の例では、filter_var() 関數(shù)を使用して整數(shù)を検証します。
★
ILTER_VALIDATE_INTFilter は整數(shù)を検証値として受け取ります。 <?php
header("Content-type:text/html;charset=utf-8");
$int = 123;
if(!filter_var($int, FILTER_VALIDATE_INT))
{
echo("不是一個(gè)合法的整數(shù)");
}
else
{
echo("是個(gè)合法的整數(shù)");
}
?>
プログラムの実行結(jié)果:
は有効な整數(shù)です
関數(shù)とフィルターの完全なリストについては、PHP フィルター リファレンス マニュアルを參照してください。
検証とサニタイズ
2 つのフィルターがあります:
検証フィルター:
?ユーザー入力の検証に使用されます?厳密なフォーマット規(guī)則 (URL や電子メールの検証など)
· 成功した場合は予期されたタイプを返し、失敗した場合は FALSE を返します
サニタイジングフィルター:
· 文字列內(nèi)の指定された文字を許可または禁止するために使用されます ?データ形式の規(guī)則はありません ?常に文字列を返します オプションとフラグ オプションとフラグは、指定されたフィルターに追加のフィルターオプションを追加するために使用されます。 異なるフィルターには異なるオプションとフラグがあります。 例 以下の例では、「min_range」および「max_range」オプションを指定した filter_var() を使用して整數(shù)を検証しています。 上記のコードと同様に、オプションは「options」という名前の関連配列內(nèi)。フラグを使用する場合、フラグを配列にする必要はありません。 整數(shù)は「300」であり、指定された範(fàn)囲內(nèi)にないため、上記のコードの出力は次のようになります: は有効な整數(shù)ではありません 関數(shù)とフィルターについては、PHP フィルター リファレンス マニュアルをご覧ください。各フィルターで使用可能なオプションとフラグを確認(rèn)できます。 入力の検証 フォームからの入力を検証してみましょう。 最初に行う必要があるのは、探している入力データが存在することを確認(rèn)することです。 次に、filter_input() 関數(shù)を使用して入力データをフィルターします。 例 次の例では、変數(shù)「email」がGETメソッドに入力され、PHPページに渡されます: プログラムの実行結(jié)果: 例の説明 上の例では、「GET」メソッドを通じて送信される入力変數(shù) (メール) があります: 1. 「GET」タイプの「メール」入力変數(shù)があるかどうかを検出します 2。入力変數(shù)がある場合は、有効な電子メール アドレスであるかどうかを確認(rèn)します 入力をサニタイズします フォームから渡された URL をクリーンアップしてみましょう。 まず、探している入力データが存在することを確認(rèn)します。 次に、filter_input() 関數(shù)を使用して入力データを精製します。 インスタンス 次の例では、入力変數(shù) "url" が PHP ページに渡されます: 説明 ★FILTER_SANITIZE_URL フィルターは、文字列內(nèi)のすべての不正な URL 文字を削除します。 上記の例には、「GET」メソッドを通じて送信される入力変數(shù) (url) があります: 1. 「GET」タイプの「url」入力変數(shù)があるかどうかを検出します 2. この入力変數(shù)が存在する場合は、次の処理を?qū)g行します。精製して (不正な文字を削除して) $url 変數(shù)に保存します 入力変數(shù)が「http://www.ru??no??ob.com/」のような文字列の場合、精製された $url 変數(shù)は次のようになります。表示: 複數(shù)の入力のフィルタリング フォームは通常、複數(shù)の入力フィールドで構(gòu)成されます。 filter_var または filter_input 関數(shù)の繰り返し呼び出しを避けるために、filter_var_array または filter_input_array 関數(shù)を使用できます。 例 filter_input_array() 関數(shù)を使用して 3 つの GET 変數(shù)をフィルターします。受信した GET 変數(shù)は、名前、年齢、電子メール アドレスです: プログラムの実行結(jié)果: 例の説明 上記の例では、「GET」メソッドを通じて 3 つが送信されています。入力変數(shù) (名前、年齢、電子メール): 1. 入力変數(shù)の名前と指定された入力変數(shù)のフィルターを含む配列を設(shè)定します 2. filter_input_array() 関數(shù)を呼び出し、パラメーターには GET が含まれます。入力変數(shù) そして、設(shè)定したばかりの配列 3. $result 変數(shù)の "age" 変數(shù)と "e??mail" 変數(shù)に不正な入力がないか確認(rèn)します。 (不正な入力がある場合、filter_input_array() 関數(shù)の使用後、入力変數(shù)は FALSE になります。) filter_input_array() 関數(shù)の 2 番目のパラメーターには、配列または単一フィルターの ID を指定できます。 パラメーターが単一フィルターの ID の場合、指定されたフィルターは入力配列內(nèi)のすべての値をフィルター処理します。 パラメータが配列の場合、その配列は次の規(guī)則に従う必要があります: · 連想配列である必要があり、それに含まれる入力変數(shù)は配列のキー (「年齢」など)入力変數(shù)) · この配列の値は、フィルターの ID、またはフィルター、フラグ、オプションを指定する配列である必要があります フィルターコールバックを使用する ★ FILTER_CALLBACK フィルターはユーザー定義関數(shù)を使用して値をフィルターします FILTER_CALLBACK フィルターを使用すると、カスタム関數(shù)を呼び出してフィルターとして使用できます。このようにして、データのフィルタリングを完全に制御できます。 獨(dú)自のカスタム関數(shù)を作成することも、既存の PHP 関數(shù)を使用することもできます。 指定されたオプションの指定方法に応じて、使用するフィルタの機(jī)能を指定します。 「options」という名前の連想配列內(nèi)。 例 以下の例では、カスタム関數(shù)を使用してすべての「_」を「.」に変換します。 プログラムの実行結(jié)果: cn! 例の説明 上記の例は、すべての「_」を「.」に変換します: 1.「_」を「.」に置き換える関數(shù)を作成します<?php
header("Content-type:text/html;charset=utf-8");
$var=300;
$int_options = array(
"options"=>array
(
"min_range"=>0, //最小值
"max_range"=>256 //最大值
)
);
if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
{
echo("不是一個(gè)合法的整數(shù)");
}
else
{
echo("是個(gè)合法的整數(shù)");
}
?>
<?php
header("Content-type:text/html;charset=utf-8");
if(!filter_has_var(INPUT_GET, "email"))
{
echo("沒有 email 參數(shù)");
}
else
{
if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))
{
echo "不是一個(gè)合法的 E-Mail";
}
else
{
echo "是一個(gè)合法的 E-Mail";
}
}
?>
<?php
header("Content-type:text/html;charset=utf-8");
if(!filter_has_var(INPUT_GET, "url"))
{
echo("沒有 url 參數(shù)");
}
else
{
$url = filter_input(INPUT_GET,
"url", FILTER_SANITIZE_URL);
echo $url;
}
?>
<?php
header("Content-type:text/html;charset=utf-8");
$filters = array
(
"name" => array
(
"filter_has_var"=>FILTER_SANITIZE_STRING
),
"age" => array
(
"filter_has_var"=>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("輸入正確");
}
?>
<?php
header("Content-type:text/html;charset=utf-8");
function convertSpace($string)
{
return str_replace("_", ".", $string);
}
$string = "www_php_cn!";
echo filter_var($string, FILTER_CALLBACK,
array("options"=>"convertSpace"));
?>