読者です 読者をやめる 読者になる 読者になる

Keep It Real BLOG

ソフトウェアエンジニア。1児の父。 酒、ラーメン、サッカー好き。旅行も好きですが、普段は出不精で大抵たまプラーザ界隈に居ます。

IP確認処理

Web-PHP Web

IPのチェックを行うときに便利だったので、メモ。

サブネットマスクを用いたIP確認関数

/**
 * IPアドレス判定
 * @param $check_ip:チェックするIP
 * @param $ip_addr_list:IPの配列
 * @return boolean
 */
function ip_addr_match ($check_ip , $ip_addr_list) {
  $ret = false;
  while (list (, $ip) = each ($ip_addr_list)) {
    //$ipがIPアドレスのとき
    if (preg_match('/^\d+\.\d+\.\d+\.\d+$/', $ip)) {
      if ($ip == $check_ip){$ret=true;break;}
    //$ipがIPアドレス+マスクビット長のとき
    } elseif (preg_match('/^(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)$/', $ip, $m)) {
      $ipaddr = $m[1]<<24 | $m[2]<<16 | $m[3]<<8 | $m[4];
      $mask = -1 ^ ((1 << (32-$m[5]) ) -1);
      preg_match('/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/', $check_ip, $h);
      $host_addr = $h[1]<<24 | $h[2]<<16 | $h[3]<<8 | $h[4];
      $common = $ipaddr ^ $host_addr; 
      $common = $common & $mask;
      if ($common == 0){$ret=true;break;}
    }
  }
  return $ret;
}

確認したいIPと許可するIPの配列を与えてやるだけ。
許可するIPの配列はarray("192.168.0.0/16","111.111.111.1");とかするだけでOK。