入力チェックに使えるPHPのFilter関数の高度な使い方PHP

PHP

入力チェックに使えるPHPのFilter関数の高度な使い方 [PHP]

2022年3月22日

前回記載していますが、PHPは性質上Webアプリケーションで利用されるため、様々な外部入力の影響を受けます。そのため言語自前で入力チェックを行う機能を有しており、PHP Filter関数と呼ばれるものがあります。

今回はfilter_var()関数のやや高度な使い方をまとめています。

PHP Filter 関数

PHP Filter関数は、外部入力の検証およびサニタイズするために使用され、ユーザー入力のチェックに用いられる機能があり、データ検証を簡単かつ迅速に行えるように設計されています。

filter_list()関数を使用して、PHPが言語として提供しているFilter拡張機能のリスト一覧を確認できます。

PHP Filter 関数

 

範囲内の整数を検証する

次の例では、filter_var()関数を使って、ある変数の型がintで、かつ1から200までの値であるかどうかを調べます。

<?php
/* variable to check */
$target_num = 115;

/* min value */
$min = 1;
/* max value */
$max = 200;

if (filter_var($target_num, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) === false) {
  var_dump("Variable value is not within the legal range");
} else {
  var_dump("Variable value is within the legal range");
}
//string(40) "Variable value is within the legal range"

 

IPv6アドレスの検証

filter_var() 関数を使用して、変数$ipが有効なIPv6アドレスであるかどうかを調べます。

<?php
// Variable to check
$ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";

// Validate ip as IPv6
if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
  var_dump("$ip is a valid IPv6 address");
} else {
  var_dump("$ip is not a valid IPv6 address");
}
//string(63) "2001:0db8:85a3:08d3:1319:8a2e:0370:7334 is a valid IPv6 address"

 

URLの検証 - クエリ文字列が含まれているか

次の記述ではfilter_var()関数を使用して、変数 $url がクエリストリングを含むURLであるかどうか調べています。

<?php
// Variable to check
$url = "https://www.w3schools.com";

// Validate url
if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) {
  var_dump("$url is a valid URL with a query string");
} else {
  var_dump("$url is not a valid URL with a query string");
}
// string(64) "https://www.w3schools.com is not a valid URL with a query string"

 

ASCII 値が127以上の文字の除去

filter_var()関数を使って文字列をサニタイズ出来ます。ASCIIは127が最後の値なので、この例では対象の文字列からHTMLタグすべてと、ASCII 値が 127 を超える文字を削除しています。

<?php
// Variable to check
$str = "<h1>Hello WorldÆØÅ!</h1>";

// Remove HTML tags and all characters with ASCII value > 127
$newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
var_dump($newstr);
// string(12) "Hello World!"

ASCIIについて

  • この記事を書いた人

朝倉卍丸

シングルモルトスコッチなどのお土産を持ってきた人を助けるのが好きです。サービスの分割が重要ですが、まあ昔ながらの方法でやりたいこともありますよね。

よく読まれている記事

条件の0=0は全てが正であるを意味するSQL 1

SQLの条件に0=0のような記述を見かけます。 変わった書き方の条件ですが、これは「全てが正である」事を意味しており、結合条件の場合はCROSS JOINと同じです。 下記の例で言えば、結合するsub ...

DISTINCTを使わないで重複排除を考えるSQL 2

SQLのDISTINCTはEXISTSとかGROUP BYでなんとかする事もできます。 DISTINCTは暗黙的なソートがされますが、何のDBを使うにせよ過去のバージョンならともかく、最近のバージョン ...

RFC 5322に準拠させた正規表現言語別 3

RFC5322で定義されている正規表現を、各言語の正規表現に変化させた形になります。 完全な電子メール正規表現は存在しないので、結局のところ何かの公式基準に従っていたとしても、自分が携わるサービスのル ...

-PHP