【PHP8.x】FILTER_FLAG_NO_PRIV_RANGE定数の使い方
FILTER_FLAG_NO_PRIV_RANGE定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
FILTER_FLAG_NO_PRIV_RANGE定数は、PHPのデータフィルタリング機能において、IPアドレスの検証を行う際に、プライベートネットワークで使用される特定のIPアドレス範囲の入力を許可しないことを表す定数です。この定数を指定すると、外部からの入力として受け取るIPアドレスが、RFC 1918で定められているプライベートIPアドレス範囲(例えば、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16など)に該当する場合に、その値を無効として扱います。
プライベートIPアドレスは、インターネット上では直接通信できない、企業や家庭内のローカルネットワーク専用のアドレスです。この定数を使用する主な目的は、インターネットに公開されているWebアプリケーションなどが、インターネットからアクセス可能なパブリックIPアドレスのみを受け入れるようにすること、またはセキュリティ上の観点から、内部ネットワークで使用されるプライベートIPアドレスが外部から入力されることを防止することです。
具体的には、filter_var() 関数や filter_input() 関数などのフィルタリング関数で、IPアドレスを検証するフィルター(FILTER_VALIDATE_IP)と組み合わせてこのフラグを指定します。これにより、プライベートIPアドレスが入力された場合にはその入力を拒否し、アプリケーションの堅牢性やセキュリティを向上させることができます。開発者はこの定数を利用することで、予期せぬIPアドレスの処理を防ぎ、より信頼性の高いシステムを構築することが可能になります。
構文(syntax)
1<?php 2var_dump(FILTER_FLAG_NO_PRIV_RANGE);
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP FILTER_FLAG_NO_PRIV_RANGEでIP検証する
1<?php 2 3/** 4 * FILTER_FLAG_NO_PRIV_RANGE の使用例を示します。 5 * このフラグは、IPアドレスの検証時にプライベートレンジのIPアドレスを無効とします。 6 * 7 * プライベートIPレンジの例: 8 * 10.0.0.0 - 10.255.255.255 9 * 172.16.0.0 - 172.31.255.255 10 * 192.168.0.0 - 192.168.255.255 11 */ 12function demonstrateFilterFlagNoPrivRange(): void 13{ 14 // 検証する様々なIPアドレス 15 $publicIp = '8.8.8.8'; // 公開IPアドレス 16 $privateIp = '192.168.1.1'; // プライベートIPアドレス (RFC 1918) 17 $anotherPrivateIp = '10.0.0.5'; // 別のプライベートIPアドレス 18 $localLoopbackIp = '127.0.0.1'; // ローカルループバックIPアドレス 19 $invalidIp = '256.256.256.256'; // 無効なIPアドレス形式 20 21 echo "--- IPアドレス検証 (FILTER_VALIDATE_IP のみ) ---\n"; 22 echo "この場合、プライベートIPアドレスも有効とみなされます。\n"; 23 24 // FILTER_FLAG_NO_PRIV_RANGE なしの場合 25 // (FILTER_VALIDATE_IP はデフォルトでプライベートIPを許可します) 26 echo "公開IP ({$publicIp}): " 27 . (filter_var($publicIp, FILTER_VALIDATE_IP) ? "有効\n" : "無効\n"); 28 echo "プライベートIP ({$privateIp}): " 29 . (filter_var($privateIp, FILTER_VALIDATE_IP) ? "有効\n" : "無効\n"); 30 echo "別のプライベートIP ({$anotherPrivateIp}): " 31 . (filter_var($anotherPrivateIp, FILTER_VALIDATE_IP) ? "有効\n" : "無効\n"); 32 echo "ローカルループバックIP ({$localLoopbackIp}): " 33 . (filter_var($localLoopbackIp, FILTER_VALIDATE_IP) ? "有効\n" : "無効\n"); 34 echo "無効IP ({$invalidIp}): " 35 . (filter_var($invalidIp, FILTER_VALIDATE_IP) ? "有効\n" : "無効\n"); 36 37 echo "\n--- IPアドレス検証 (FILTER_VALIDATE_IP | FILTER_FLAG_NO_PRIV_RANGE) ---\n"; 38 echo "この場合、プライベートIPアドレスは無効とみなされます。\n"; 39 40 // FILTER_FLAG_NO_PRIV_RANGE を組み合わせた場合 41 // 論理OR演算子(|)で複数のフラグを組み合わせます。 42 $flags = FILTER_VALIDATE_IP | FILTER_FLAG_NO_PRIV_RANGE; 43 44 echo "公開IP ({$publicIp}): " 45 . (filter_var($publicIp, FILTER_VALIDATE_IP, $flags) ? "有効\n" : "無効\n"); 46 echo "プライベートIP ({$privateIp}): " 47 . (filter_var($privateIp, FILTER_VALIDATE_IP, $flags) ? "有効\n" : "無効\n"); 48 echo "別のプライベートIP ({$anotherPrivateIp}): " 49 . (filter_var($anotherPrivateIp, FILTER_VALIDATE_IP, $flags) ? "有効\n" : "無効\n"); 50 echo "ローカルループバックIP ({$localLoopbackIp}): " 51 . (filter_var($localLoopbackIp, FILTER_VALIDATE_IP, $flags) ? "有効\n" : "無効\n"); 52 echo "無効IP ({$invalidIp}): " 53 . (filter_var($invalidIp, FILTER_VALIDATE_IP, $flags) ? "有効\n" : "無効\n"); 54} 55 56// 関数を実行して結果を表示 57demonstrateFilterFlagNoPrivRange();
FILTER_FLAG_NO_PRIV_RANGEは、PHPのfilter_var関数でIPアドレスを検証する際に利用する定数です。この定数自体には引数はなく、値を直接返すものではありませんが、filter_var関数のオプションとして使用することで、IPアドレスの検証挙動を変更できます。
具体的には、FILTER_VALIDATE_IPフィルターとFILTER_FLAG_NO_PRIV_RANGEを組み合わせて使うと、RFC 1918で定められたプライベートIPアドレス(例: 192.168.x.x、10.x.x.x)を「無効」と判断するようになります。
サンプルコードでは、この挙動の違いを明確に示しています。まず、FILTER_VALIDATE_IPのみでIPアドレスを検証する例では、公開IPアドレスだけでなくプライベートIPアドレスも「有効」と判定されます。次に、FILTER_VALIDATE_IPにFILTER_FLAG_NO_PRIV_RANGEを論理OR演算子|で組み合わせた場合、公開IPアドレスやローカルループバックIPアドレスは有効と判定されますが、プライベートIPアドレスは「無効」と判定されることが確認できます。これは、外部からのアクセスが想定される入力値の検証において、意図せず内部ネットワークのIPアドレスを許可してしまうリスクを防ぐために役立ちます。
FILTER_FLAG_NO_PRIV_RANGEは、filter_var関数でIPアドレスを検証する際に、RFC 1918で定義されたプライベートIPアドレス範囲(例: 192.168.x.x, 10.x.x.x)を無効と判断させるための定数です。単体では機能せず、必ずFILTER_VALIDATE_IPフィルターとビット論理和演算子|を使って組み合わせてください。このフラグを利用しない場合、FILTER_VALIDATE_IPはプライベートIPアドレスも有効と見なします。そのため、公開されたウェブサービスなどで外部からのIPアドレスのみを許可したい場合に、このフラグを適用することで意図しない内部IPからの入力を排除し、セキュリティを向上できます。ただし、ローカルループバックアドレス(127.0.0.1)はプライベートIPとは異なるため、このフラグが有効な場合でも有効と判断される点にご注意ください。
IPアドレスがプライベート範囲でないか検証する
1<?php 2 3/** 4 * IPアドレスがプライベート範囲でないか検証するサンプル。 5 * 6 * FILTER_FLAG_NO_PRIV_RANGE は、 7 * IPアドレスがプライベートネットワーク範囲 (例: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) 8 * に属していないかを検証する際に使用されるフラグです。 9 * このフラグが指定された場合、プライベートIPアドレスは無効と判断されます。 10 */ 11function validatePublicIpAddress(string $ipAddress): void 12{ 13 echo "検証中のIPアドレス: " . $ipAddress . PHP_EOL; 14 15 // FILTER_VALIDATE_IP フィルターと FILTER_FLAG_NO_PRIV_RANGE フラグを使用して検証 16 $filteredIp = filter_var( 17 $ipAddress, 18 FILTER_VALIDATE_IP, 19 FILTER_FLAG_NO_PRIV_RANGE 20 ); 21 22 if ($filteredIp === false) { 23 echo "結果: 無効です。これはパブリックIPアドレスではありません(または無効な形式です)。" . PHP_EOL; 24 } else { 25 echo "結果: 有効です。これはパブリックIPアドレスです。" . PHP_EOL; 26 } 27 echo "---" . PHP_EOL; 28} 29 30// サンプル実行 31validatePublicIpAddress('192.168.1.100'); // プライベートIPアドレス 32validatePublicIpAddress('172.16.0.1'); // プライベートIPアドレス 33validatePublicIpAddress('10.0.0.5'); // プライベートIPアドレス 34validatePublicIpAddress('8.8.8.8'); // パブリックIPアドレス 35validatePublicIpAddress('203.0.113.42'); // パブリックIPアドレス (ドキュメント用IP) 36validatePublicIpAddress('invalid-ip'); // 無効な形式
PHP 8で提供される定数FILTER_FLAG_NO_PRIV_RANGEは、IPアドレスがプライベートネットワーク範囲(例: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)に属していないかを検証する際に使用されるフラグです。この定数自体は、特定の値を表すものであり、引数や戻り値はありません。主に、filter_var関数のようなデータフィルタリング関数と組み合わせて利用されます。
サンプルコードでは、validatePublicIpAddress関数を通して、入力されたIPアドレスがパブリックIPアドレスであるかを確認しています。ここでは、filter_var関数にIPアドレスの形式を検証するFILTER_VALIDATE_IPと、プライベートIPアドレスを除外するFILTER_FLAG_NO_PRIV_RANGEフラグを指定しています。これにより、filter_var関数は、IPアドレスがプライベート範囲に属している場合や、IPアドレスとして無効な形式の場合にfalseを返します。
例えば、'192.168.1.100'や'10.0.0.5'といったプライベートIPアドレスは「無効」と判断されます。これに対し、'8.8.8.8'のようなパブリックIPアドレスは「有効」と判断されます。また、'invalid-ip'のようにIPアドレスの形式ではない文字列も「無効」となります。このフラグは、アプリケーションがインターネット上のパブリックなIPアドレスのみを扱う必要がある場合に、非常に有効な検証手段となります。
この定数は、入力されたIPアドレスがプライベートネットワーク用のアドレスではないかを確認するために使用します。filter_var()関数とFILTER_VALIDATE_IPフィルターと組み合わせて使うことで、外部向けのパブリックIPアドレスのみを有効と判断できます。filter_var()がfalseを返した場合、IPアドレスの形式が不正か、プライベートIPアドレスであるかのどちらかですので、結果の解釈に注意が必要です。外部からのIPアドレス入力を扱う際に、この定数を利用すると、意図せず内部ネットワークのアドレスが指定されるのを防ぎ、セキュリティ向上に役立ちます。定数であるため、値は変更できません。