昨日、ユーザーの IP のソースを特定し、ユーザーの IP が存在するネットワーク セグメントのアドレスを入力する必要がありました。最初に実装する必要があるのは、IP アドレスを整数に変換することです。システム関数 ip2long と long2ip を見てみましょう
PHP には、IP アドレスを整数に変換できる組み込み関数 ip2long があります。
コードをコピー | |
$ip = '210.110.11.49'; echo ip2long($ip); 出力: -764540111
|
。
3530427185long2ip を使用して整数を IP アドレスに変換します
コードをコピー | |
$ip = '210.110.11.49'; $ip_int = ip2long($ip); echo $ip." "; echo $ip_int." "; エコーlong2ip($ip_int);
出力:
-764540111 |
システム機能の小さなバグ
このバグはインターネット全体で見つかります。これは基本的に、IP アドレスの特定のセグメントに先頭に 0 を追加することを意味します。まず、このバグの例を見てみましょう。
コードをコピー | |
$ip = '210.110.011.49';
echo $ip." echo $ip_int." エコーlong2ip($ip_int); 出力:
210.110.9.49 |
コードをコピー | |
$ip = '021.110.11.49';
echo $ip." echo $ip_int." エコーlong2ip($ip_int); 出力:
17.110.11.49 |
変換原理
現在 2 つのアルゴリズムがあります:
最初と最初の段落に 256 の 3 乗を掛け、2 番目の段落に 256 の 2 乗を掛け、3 番目の段落に 256 を掛けて、最終的な合計を求めます
コードをコピー | |||||||||||||
関数 ipToInt($ip){
$num = 0; for($i=0;$i $num += intval($iparr[$i]) * pow(256,count($iparr)-($i+1)); } $num を返します; }
echo $ip_int.' エコーlong2ip($ip_int); 出力: 0210.110.11.49
210.110.11.49 |
コードは次のとおりです | コードをコピー |
$iparr = 爆発('.',$ip); return (intval($iparr[0]<<24))|(intval($iparr[1])<<16)|(intval($iparr[2])<<8)| (intval($iparr[3])); }
$ip_int = ipToInt($ip); echo $ip_int.' エコーlong2ip($ip_int);
0210.110.11.49 |
IPが合法かどうかを確認してください
まず自分で横断して検出してください
コードは次のとおりです | コードをコピー |
$iparr = 爆発('.',$ip); foreach($iparr as $v){ if($v>255) return false } true を返す; }
エコー '210.285.11.49,'; var_dump(check_ip('210.285.11.49')); エコー ' エコー '210.205.11.49,'; var_dump(check_ip('210.205.11.49'));
210.285.11.49,bool(false) |
2番目に、ip2longを使用して戻ります
コードは次のとおりです | コードをコピー |
if(ip2long($ip)) true を返す; false を返す; }
var_dump(check_ip('210.285.11.49')); エコー ' エコー '210.205.11.49,'; var_dump(check_ip('210.205.11.49'));
210.285.11.49,bool(false) |