ホームページ  >  記事  >  バックエンド開発  >  PHP は、IP4 が特定の IP セグメントに属しているかどうかを判断します

PHP は、IP4 が特定の IP セグメントに属しているかどうかを判断します

angryTom
angryTom転載
2019-10-15 16:53:364156ブラウズ

PHP は、IP4 が特定の IP セグメントに属しているかどうかを判断します

訪問者を制限するには、IP ブラックリストまたは IP ホワイトリストを作成する必要があることがよくあります。非常に一般的なのは、同じ IP セグメント内のすべての IP を制限することです。許可または制限します。 、次に、訪問者の IP が IP 範囲に属しているかどうかを知る必要があります。この記事ではその方法のみを記録します。

実際には、この記事には別のアプリケーション シナリオがあります。つまり、データベースに保存される IP アドレスは通常、varchar 型です。IP の保存に INT 型を使用すると、データベースを最適化できます。 . もちろん、ここでは IP4 についてのみ説明します。

IP が特定の IP セグメントに属しているかどうかを判断するには、IP を int 型の値に変換して比較します。 PHP には、IP と数値を交換するための組み込み関数 ip2long($ip_addr) と long2ip($long) があります。

ip2long($ip_addr) では、$ip_addr が有効な IP アドレスでない場合は false が返され、有効な IP アドレスである場合は、signed long 型に変換されます。変換される 符号付きの長い長さを超える可能性があり、その結果、負の数が返されます。

long 型は 4 バイト、符号付きの範囲は 2147483647 ~ -2147483648、符号なしの範囲は 4294967295 ~ 0

そして最大の IP4 アドレスは 255.255. 255.255、対応する値は 4294967295 であるため、符号なしの値に変換できます。値 2147483647 に対応する IP は 127.255.255.255,

long2ip(2147483647) であるため、0.0.0.0 ~ 127.255.255.255 の範囲の IP アドレスには負の数はありませんが、 128.0.0.0 ~ 255.255.255.255 内には負の数値が入ります。

次のコードは、指定された IP が特定の IP セグメントに属しているかどうかを判断する完全で正しい例を示しています。

$start_ip = "42.236.184.1";
$end_ip   = "42.236.184.255";
$ip = "42.236.184.128";
check_ip($ip,$start_ip,$end_ip);
function check_ip($ip,$start_ip,$end_ip)
{
$ip = get_ip2long($ip);
$start_ip = get_ip2long($start_ip);
$end_ip = get_ip2long($end_ip);
if($ip >= $start_ip && $ip <= $end_ip)
{
return true;
}
return false;
}
// decbin() 十进制转二进制
// bindec() 二进制转十进制。函数将一个二进制数转换成 integer。可转换的最大的数为 31 位 1 或者说十进制的 2147483647。PHP 4.1.0 开始,该函数可以处理大数值,这种情况下,它会返回 float 类型。
function get_ip2long($ip)
{
return bindec(decbin(ip2long($ip)));
//方法二:return sprintf(&#39;%u&#39;,ip2long($ip)); //%u:不包含正负号的十进制数
}

PHP 関連の知識については、PHP 中国語 Web サイト をご覧ください。

以上がPHP は、IP4 が特定の IP セグメントに属しているかどうかを判断しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はwww.mafutian.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。