【PHP8.x】FILTER_FLAG_NO_RES_RANGE定数の使い方
FILTER_FLAG_NO_RES_RANGE定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
FILTER_FLAG_NO_RES_RANGE定数は、PHPのフィルタリング機能でIPアドレスの検証を行う際、予約済みのプライベートIPアドレス範囲のものを無効として扱うように指定するために使用される定数です。この定数は、主にFILTER_VALIDATE_IPフィルターと組み合わせて利用され、指定されたIPアドレスが特定の内部ネットワーク用のアドレス(例えば、10.0.0.0/8、172.16.0.0/12、192.168.0.0/16など)である場合に、そのIPアドレスを無効として判断させます。
システム開発において、ウェブアプリケーションなどが外部からIPアドレスの入力を受け取る場合、多くはインターネット上で公開されているグローバルIPアドレスが期待されます。もし、意図せず内部ネットワークで利用されるプライベートIPアドレスが入力されてしまうと、アプリケーションの動作に予期せぬ影響を与えたり、セキュリティ上のリスクにつながる可能性があります。
この定数を利用することで、filter_var関数やfilter_input関数といったフィルタリング機能を通じて、受け取ったIPアドレスが予約済みのプライベートIPアドレス範囲に属していないかを厳密にチェックできます。これにより、データの正確性を保ち、アプリケーションが安全に動作するための堅牢な入力検証メカニズムを構築することが可能になります。
構文(syntax)
1<?php 2$filtered_ip = filter_var('192.168.1.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE);
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
FILTER_FLAG_NO_RES_RANGEで予約済みIPを除外する
1<?php 2 3/** 4 * FILTER_FLAG_NO_RES_RANGE フラグを使ってIPアドレスを検証するサンプル関数。 5 * 6 * このフラグは、予約済みIPアドレス範囲 (例: 0.0.0.0/8, 100.64.0.0/10, 192.0.0.0/24 など) 7 * を「有効なIPアドレス」として扱わないようにするために使用します。 8 * システムエンジニアを目指す初心者の方へ: 9 * ネットワーク設定やセキュリティの文脈で、これらの特殊なIPアドレスが 10 * 意図せず有効なものとして扱われるのを防ぐために活用されます。 11 * 12 * @param string $ipAddress 検証するIPアドレス文字列 13 * @return void 14 */ 15function validateIpWithNoResRange(string $ipAddress): void 16{ 17 // FILTER_VALIDATE_IP は、入力が有効なIPアドレスであるかを検証します。 18 // FILTER_FLAG_NO_RES_RANGE フラグは、予約済みIPアドレス範囲を無効と判断させるオプションです。 19 // 例: 0.0.0.0 や 192.0.0.0 といった予約済みIPアドレスが、このフラグによって無効と判断されます。 20 $filteredIp = filter_var( 21 $ipAddress, 22 FILTER_VALIDATE_IP, 23 FILTER_FLAG_NO_RES_RANGE 24 ); 25 26 echo "IPアドレス: '" . $ipAddress . "' => "; 27 28 if ($filteredIp !== false) { 29 echo "有効なグローバルIPアドレスです。\n"; 30 } else { 31 echo "無効なIPアドレスまたは予約済みIPアドレスです。\n"; 32 } 33 34 // 参考: プライベートIPアドレス (例: 10.0.0.1, 192.168.1.1) を無効にするには、 35 // FILTER_FLAG_NO_PRIV_RANGE フラグも併用します。 36 // その場合、オプションは FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_NO_PRIV_RANGE となります。 37} 38 39// --- サンプル実行 --- 40// 検証するIPアドレスのリスト 41$ipAddressesToTest = [ 42 '8.8.8.8', // 有効なグローバルIPアドレス (Google Public DNS) 43 '0.0.0.0', // 予約済みIPアドレス (RFC 1122), FILTER_FLAG_NO_RES_RANGE で無効と判断されます 44 '192.0.0.0', // 予約済みIPアドレス (RFC 6890), FILTER_FLAG_NO_RES_RANGE で無効と判断されます 45 '10.0.0.1', // プライベートIPアドレス (RFC 1918), このフラグ単独では有効と判断されます 46 '192.168.1.1', // プライベートIPアドレス (RFC 1918), このフラグ単独では有効と判断されます 47 'invalid-ip-string',// 不正な形式の文字列、常に無効と判断されます 48]; 49 50echo "--- FILTER_FLAG_NO_RES_RANGE を使用したIPアドレス検証結果 ---\n"; 51 52foreach ($ipAddressesToTest as $ip) { 53 validateIpWithNoResRange($ip); 54}
PHPのFILTER_FLAG_NO_RES_RANGEは、IPアドレスの検証を行う際に使用する定数です。この定数は、特定の「予約済みIPアドレス範囲」(例えば、0.0.0.0/8や192.0.0.0/24など、特別な用途のために確保されているIPアドレス)を、有効なIPアドレスとして扱わないようにする目的で利用されます。システムエンジニアを目指す初心者の方にとって、ネットワークのセキュリティやルーティング設定において、これらの特殊なIPアドレスが意図せず有効なものとして判断されることを防ぐために非常に重要です。
この定数は単独で使うのではなく、主にPHPのfilter_var関数と組み合わせて使用します。filter_var関数は、指定された変数をフィルタリングまたは検証するためのもので、FILTER_VALIDATE_IPフィルタとFILTER_FLAG_NO_RES_RANGEフラグを一緒に使うことで、入力されたIPアドレスが有効かつ予約済み範囲外であるかをチェックできます。
サンプルコードでは、validateIpWithNoResRange関数がIPアドレス文字列を引数として受け取り、filter_var関数を用いてそのIPアドレスを検証しています。例えば、「8.8.8.8」のような一般的なIPアドレスは有効と判断されますが、「0.0.0.0」や「192.0.0.0」のような予約済みIPアドレスは無効と判断されます。filter_var関数の戻り値は、検証に成功した場合はフィルタリングされた値(この場合はIPアドレス文字列)、失敗した場合はfalseとなります。この定数自体に引数や戻り値はありません。
FILTER_FLAG_NO_RES_RANGEは、ネットワーク予約済みの特殊なIPアドレス(例: 0.0.0.0、192.0.0.0など)を無効と判断させるためのフラグです。これはシステムにおけるセキュリティや意図しない挙動を防ぐ上で重要な機能となります。
ただし、このフラグだけでは10.0.0.1や192.168.1.1のようなプライベートIPアドレスは有効なIPアドレスとして扱われますので注意が必要です。もしプライベートIPアドレスも無効としたい場合は、FILTER_FLAG_NO_PRIV_RANGEフラグを組み合わせて使用してください。filter_var関数は検証に失敗するとfalseを返します。そのため、結果の判定には厳密な比較である!== falseを用いるようにしてください。
PHP: FILTER_FLAG_NO_RES_RANGE でIPアドレスを検証する
1<?php 2 3/** 4 * IPアドレスのフィルタリングフラグ FILTER_FLAG_NO_RES_RANGE の使用例を示します。 5 * 6 * FILTER_FLAG_NO_RES_RANGE は、PHPの filter_var() 関数でIPアドレスを検証する際に、 7 * 通常有効と判断されることがあるループバックアドレス(例: 127.0.0.1)や、 8 * その他の特定の予約済みIPアドレス範囲(例: 0.0.0.0/8, 169.254.0.0/16, 240.0.0.0/4 など)を、 9 * 「無効」として扱いたい場合に使用するフラグです。 10 * このフラグを付けると、これらの予約済みIPアドレスはフィルタリングを通過できなくなり、 11 * filter_var() は false を返します。 12 */ 13function demonstrateFilterFlagNoResRange(): void 14{ 15 echo "--- FILTER_FLAG_NO_RES_RANGE の使用例 ---" . PHP_EOL; 16 17 // テスト用のIPアドレス 18 $loopbackIp = '127.0.0.1'; // ループバックアドレス (予約済みIPの一つ) 19 $reservedIpClassE = '240.0.0.1'; // 予約済みIPアドレス (Class E) 20 $publicIp = '8.8.8.8'; // パブリックIPアドレス 21 $invalidIp = '256.256.256.256'; // 無効なIPアドレス 22 23 echo "\n■ 通常のIPアドレス検証 (FILTER_VALIDATE_IP のみ):" . PHP_EOL; 24 // デフォルトでは、ループバックアドレスは有効、予約済みClass Eは無効と判断されます。 25 $filteredLoopbackIpDefault = filter_var($loopbackIp, FILTER_VALIDATE_IP); 26 $filteredReservedIpClassEDefault = filter_var($reservedIpClassE, FILTER_VALIDATE_IP); 27 $filteredPublicIpDefault = filter_var($publicIp, FILTER_VALIDATE_IP); 28 $filteredInvalidIpDefault = filter_var($invalidIp, FILTER_VALIDATE_IP); 29 30 echo " '{$loopbackIp}' (ループバックIP): " . ($filteredLoopbackIpDefault ? "有効" : "無効") . PHP_EOL; 31 echo " '{$reservedIpClassE}' (予約済みClass E IP): " . ($filteredReservedIpClassEDefault ? "有効" : "無効") . PHP_EOL; 32 echo " '{$publicIp}' (パブリックIP): " . ($filteredPublicIpDefault ? "有効" : "無効") . PHP_EOL; 33 echo " '{$invalidIp}' (無効なIP): " . ($filteredInvalidIpDefault ? "有効" : "無効") . PHP_EOL; 34 35 echo "\n■ FILTER_FLAG_NO_RES_RANGE を使用したIPアドレス検証:" . PHP_EOL; 36 // FILTER_FLAG_NO_RES_RANGE を使用すると、ループバックアドレスを含む予約済みIPアドレスは無効と判断されます。 37 $filteredLoopbackIpWithFlag = filter_var($loopbackIp, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE); 38 $filteredReservedIpClassEWithFlag = filter_var($reservedIpClassE, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE); 39 $filteredPublicIpWithFlag = filter_var($publicIp, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE); 40 $filteredInvalidIpWithFlag = filter_var($invalidIp, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE); 41 42 echo " '{$loopbackIp}' (ループバックIP): " . ($filteredLoopbackIpWithFlag ? "有効" : "無効") . PHP_EOL; 43 echo " '{$reservedIpClassE}' (予約済みClass E IP): " . ($filteredReservedIpClassEWithFlag ? "有効" : "無効") . PHP_EOL; 44 echo " '{$publicIp}' (パブリックIP): " . ($filteredPublicIpWithFlag ? "有効" : "無効") . PHP_EOL; 45 echo " '{$invalidIp}' (無効なIP): " . ($filteredInvalidIpWithFlag ? "有効" : "無効") . PHP_EOL; 46} 47 48// 関数の実行 49demonstrateFilterFlagNoResRange();
PHPのFILTER_FLAG_NO_RES_RANGEは、IPアドレスを検証する際に利用する定数です。この定数自体に引数や戻り値はありませんが、filter_var()関数の第3引数(オプション)として指定することで、IPアドレスのフィルタリング挙動を変更します。具体的には、通常は有効と判断されるループバックアドレス(例: 127.0.0.1)や、特定の予約済みIPアドレス範囲(例: 0.0.0.0/8、169.254.0.0/16、240.0.0.0/4など)を「無効」として扱うようにfilter_var()関数に指示します。
このフラグを使用すると、これらの予約済みIPアドレスは検証を通過できなくなり、filter_var()関数はfalseを返します。これにより、ウェブアプリケーションなどでユーザーからのIPアドレス入力を受け付ける際に、内部ネットワークへの接続や特定の予約済み範囲からのアクセスを厳しく制限することが可能になります。サンプルコードでは、このフラグの有無によって、ループバックアドレスなどの予約済みIPアドレスが「有効」から「無効」に変わる様子を具体的に比較して示しています。
このサンプルコードのFILTER_FLAG_NO_RES_RANGEは、IPアドレス検証時に特定の予約済みIPアドレスを「無効」と判断させるためのフラグです。このフラグを使用しない場合、ループバックアドレス(127.0.0.1など)は通常有効と判断されますが、このフラグを適用すると無効になります。外部からの入力検証において、システム内部や開発環境のIPアドレスなど、意図しないアクセスを防ぎたい場合に特に有効です。このフラグを使うことで、予約済みIPアドレス範囲からの潜在的な脅威を排除し、アプリケーションのセキュリティを向上させることができます。利用する際は、何が有効で何が無効になるのかを理解し、目的と合致しているか確認することが重要です。