11

IP アドレスが内部専用 (つまり、プライベート) IP であるかどうかを確認しようとしていますが、興味深い結果が得られます。

filter_var('173.194.66.94', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // returns 173.194.66.94
filter_var('192.168.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // returns false
filter_var('127.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); // returns 127.0.0.1?

確かに 127.0.0.1 はプライベート IP としてカウントされますか? これを問題として報告している2010 年のバグ レポートを見つけましたが、修正済みとしてマークされています。これは回帰ですか、それともこのフィルターの機能を誤解していますか? PHP 5.4.6 を使用しています。

4

2 に答える 2

7

ここで説明されているように、127.0.0.1 はprivate実際には IP 範囲ではなく、IP 範囲であるためだと思います。loopback

通常、TCP/IP アプリケーションが情報を送信する場合、その情報はプロトコル層を下って IP に移動し、そこで IP データグラムにカプセル化されます。次に、そのデータグラムは、デバイスの物理ネットワークのデータ リンク層に渡され、IP 宛先に向かう途中でネクスト ホップに送信されます。

ただし、ループバック機能用に 1 つの特別なアドレス範囲が確保されています。これは 127.0.0.0 から 127.255.255.255 の範囲です。ホストから 127.xxx ループバック アドレスに送信された IP データグラムは、送信のためにデータ リンク層に渡されません。代わりに、IP レベルでソース デバイスに「ループ バック」します。本質的に、これは通常のプロトコルスタックの「短絡」を表しています。データはデバイスのレイヤ 3 IP 実装によって送信され、すぐに受信されます。

ループバック範囲の目的は、ホストでの TCP/IP プロトコルの実装をテストすることです。下位層は短絡されているため、ループバック アドレスに送信すると、上位層 (IP 以上) を効果的にテストでき、下位層で問題が発生する可能性はありません。127.0.0.1 は、テスト目的で最も一般的に使用されるアドレスです。

フィルター フラグのマニュアルには、この特定の問題に関するコメントがあります。

<?php
function FILTER_FLAG_NO_LOOPBACK_RANGE($value) {
    // Fails validation for the following loopback IPv4 range: 127.0.0.0/8
    // This flag does not apply to IPv6 addresses
    return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ? $value :
        (((ip2long($value) & 0xff000000) == 0x7f000000) ? FALSE : $value);
}

$var = filter_var('127.0.0.1', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns FALSE

$var = filter_var('74.125.19.103', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns '74.125.19.103'

// To filter Private IP ranges and Loopback ranges
$var = filter_var('127.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)  && filter_var('127.0.0.1', FILTER_CALLBACK, array('options' => 'FILTER_FLAG_NO_LOOPBACK_RANGE'));
// Returns FALSE
?>
于 2013-06-17T14:42:09.733 に答える