php – 查找给定的IP是否存在于CIDR中

前端之家收集整理的这篇文章主要介绍了php – 查找给定的IP是否存在于CIDR中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用尝试访问我的网站的$_SERVER [‘REMOTE_ADDR’]获取用户的IP地址.在我的数据库中,每个框都有不同的IDS和不同的CIDR条目.我想检查用户IP是否存在于任何CIDR中,而不是特定的框.
如果存在,那么他被允许进入,否则不允许.
假设用户IP是
127.0.0.1

假设框12的CIDR条目是

192.168.1.20/27
192.168.0.10/32

CIDR条目存储在数据库中的一列中

如果他来到这个范围内的IP,那么他应该被允许进入网站,否则不允许.
我想检查他的ip对每个CIDR条目.

有什么想法吗?

谢谢

好的,请尝试以下5个简单步骤

1.将您的CIDR存储到数组中(从数据库读取数据;猜你知道如何得到这个)

$cidrs = array(
  '192.168.1.20/27','192.168.0.10/32'
  );

2.获取用户的IP(远程地址)

$user_ip = $_SERVER['REMOTE_ADDR'];

3.添加功能

function IPvsCIDR($user_ip,$cidr) {
  $parts = explode('/',$cidr);
  $ipc = explode('.',$parts[0]);
  foreach ($ipc as &$v)
    $v = str_pad(decbin($v),8,'0',STR_PAD_LEFT);
  $ipc = substr(join('',$ipc),$parts[1]);
  $ipu = explode('.',$user_ip);
  foreach ($ipu as &$v)
    $v = str_pad(decbin($v),STR_PAD_LEFT);
  $ipu = substr(join('',$ipu),$parts[1]);
  return $ipu == $ipc;
  }

4.比较用户的IP地址与$cidrs

$validaddr = false;
foreach ($cidrs as $addr)
  if (IPvsCIDR($user_ip,$addr)) {
    $validaddr = true;
    break;
    }

5.决定用户如何处理

if ($validaddr) {
  echo "CORRECT IP ADDRESS";
  }
else {
  echo "INCORRECT IP ADDRESS";
  }

而已!

这个功能如何工作.它将CIDR地址部分(x.x.x.x)转换为二进制字符串,并获取前N个数字.然后,它与用户的IP执行相同的工作,并且检查值是否匹配.

示例2(功能完成)

function testUserIP($user_ip,$cidrs) {
  $ipu = explode('.',STR_PAD_LEFT);
  $ipu = join('',$ipu);
  $res = false;
  foreach ($cidrs as $cidr) {
    $parts = explode('/',$cidr);
    $ipc = explode('.',$parts[0]);
    foreach ($ipc as &$v) $v = str_pad(decbin($v),STR_PAD_LEFT);
    $ipc = substr(join('',$parts[1]);
    $ipux = substr($ipu,$parts[1]);
    $res = ($ipc === $ipux);
    if ($res) break;
    }
  return $res;
  }

用法

$user_ip = $_SERVER['REMOTE_ADDR'];
$cidrs = array('192.168.1.20/27','192.168.0.10/32'); 
if (testUserIP($user_ip,$cidrs)) {
  // user ip is ok
  }
else {
  // access denied
  }

猜你在找的PHP相关文章