入力チェックに使えるPHPのFilter関数PHP

PHP

入力チェックに使えるPHPのFilter関数 [PHP]

入力チェックを行いたい場合、自前で判定処理作るのが常というのはありますが、PHPはFilter関数と呼ばれる言語自体に用意された、検証とサニタイズを行う機能があります。ちなみに検証とサニタイズの定義は下記ということになっています。

データの検証=データが適切な形式であるかどうかを判断。

データのサニタイズ=データから不正な文字を削除。

PHP Filter 関数

PHP Filter関数は、外部からの入力を検証およびサニタイズするために使用します。

PHP のFilter拡張機能は、ユーザーの入力をチェックするために必要な機能を備えており、 データの検証をより簡単かつ迅速に行うように設計されています。

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

PHP Filter 関数

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

多くのWebアプリケーションは外部入力を受けて成立します。そのためPHPは自身でそれを補完出来る機能を提供したわけです。条件によっては結構使えるので検討して見るのも良いでしょう。

想定している外部入力とデータは次のとおりです。

  • 入力フォームからのユーザー入力
  • Cookies
  • Webサービスのデータ
  • Server変数
  • データベースクエリの結果

PHP filter_var() 関数

filter_var()関数は、データの検証とサニタイズの両方を行い、指定されたフィルタを用いて指定した変数をフィルタリングします。この関数は2つのデータを受け取ります。

  • チェックしたい変数
  • 使用するチェックの種類

PHP filter_var 関数

文字列のサニタイズ

filter_var()関数を使って、文字列からすべてのHTMLタグを削除します。

<?php
$str = "<h1>Hello World!</h1>";
$newstr = filter_var($str, FILTER_SANITIZE_STRING);
var_dump($newstr);
//Hello World!

整数の検証

次の例では、filter_var()関数を使って、変数$target_numが整数であるかどうかを調べています。

以下のコードの例だと、$target_num が整数であれば"Integer is valid" となり、$target_numが整数でない場合、"Integer is not valid"と出力されます。

<?php
$target_num = 100;

if (!filter_var($target_num, FILTER_VALIDATE_INT) === false) {
  var_dump("Integer is valid");
} else {
  var_dump("Integer is not valid");
}
//string(16) "Integer is valid"

Tip: filter_var()と0の問題

0の扱いが独特なため、上の例では、$target_numが0に設定されていた場合、"Integer is not valid"を返してしまいます。この問題を解決するには以下の記述を使用します。

<?php
$target_num = 0;

if (filter_var($target_num, FILTER_VALIDATE_INT) === 0 || !filter_var($target_num, FILTER_VALIDATE_INT) === false) {
  var_dump("Integer is valid");
} else {
  var_dump("Integer is not valid");
}
//string(16) "Integer is valid"

IPアドレスの検証

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

<?php
$ip = "127.0.0.1";

if (!filter_var($ip, FILTER_VALIDATE_IP) === false) {
  var_dump("$ip is a valid IP address");
} else {
  var_dump("$ip is not a valid IP address");
}
//string(31) "127.0.0.1 is a valid IP address"

メールアドレスのサニタイズと検証

まず$email_address変数から不正な文字をすべて取り除き、次に$emailが有効なメールアドレスであるかどうかをチェックします。

<?php
$email_address = "john.wick@example.com";

// Remove all illegal characters from email
$email = filter_var($email_address, FILTER_SANITIZE_EMAIL);

// Validate e-mail
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
  var_dump("$email is a valid email address");
} else {
  var_dump("$email is not a valid email address");
}
//string(46) "john.wick@example.com is a valid email address"

URLのサニタイズとバリデーション

まず$target_url変数から不正な文字をすべて削除し、次に$urlが有効なURLであるかどうかを調べます。

<?php
$target_url = "https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8";

// Remove all illegal characters from a url
$url = filter_var($target_url, FILTER_SANITIZE_URL);

// Validate url
if (!filter_var($url, FILTER_VALIDATE_URL) === false) {
  var_dump("$url is a valid URL");
} else {
  var_dump("$url is not a valid URL");
}
//string(99) "https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 is a valid URL"
  • この記事を書いた人

朝倉卍丸

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

よく読まれている記事

条件の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