PHP Tech

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

前回記載していますが、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について


  • この記事を書いた人

朝倉卍丸

-PHP, Tech

© 2021 Tech Economy