ユーザーの IP アドレスを取得していますが、その IP アドレスがアクセス可能な範囲内にあるかどうかを判断したいと考えています。
私がやっていることは、PHP スクリプトで「ip2long」関数を使用し、それを IP アドレスの許容範囲と比較することです。
私はこれがそれを行うためのきれいな方法ではないことを知っています...誰かがそれを行うためのより良い考えを持っていますか?
どんな助けでも感謝します。
ありがとう、アミット
少なくとも、上位 N ビットを既知のプライベートまたは既知の未使用のネットワーク ブロックと比較する必要があります。そして、その最小はRFC 1918 プライベート ネットワークです。
10/8
172.16/12
192.168/16
(この表記は、上位 8 ビットをマスクして「10」を取得した場合、最初のプライベート ブロックにあることを意味します。12 ビット == 172.16 は 2 番目などです。)
検出できるブロックは他にもたくさんあります。
最も簡単な例は 127/8 で、これはすべてループバック アドレスです。おそらく 127.0.0.1 についてはご存知でしょうが、実際にはすべての 127.xyz アドレスがマシンのループバック インターフェイスを参照しています。
よりあいまいな例は 5/8 で、これは割り当てられたものの、広いインターネット上で使用されることはなかったため、Hamachiによって流用されました。ただし、Hamachi ネットワークにアクセスできるマシンでプログラムを実行できる可能性がある場合は、このテストには注意が必要です。
おそらく無視したいもう 1 つのアドレス セットは、さまざまなマルチキャスト範囲です。TCP接続ではなく、UDPパケットのみを送信する必要があります。
本当に積極的になりたい場合は、まだ割り当てられていないブロックからの IP を無視して、 IANAによって公開された最新の割り当てを最新の状態に保つことができます。ただし、そのリストを頻繁に更新しておく必要があります。
PHP はほとんどすべてのことを行います。
filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4| FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
IP がプライベートまたは予約済みの範囲にある場合、これは false を返します。範囲がアクセス可能である場合、IP を返します。常にブール値を返すには、次のようなものを考え出すことができます。
function isAccessibleRangeIP($ip)
{
return (bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4| FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
}