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

Far*_*han 9 php codeigniter

我正在使用试图访问我网站的$ _SERVER ['REMOTE_ADDR']获取用户的IP地址.我的数据库中每个框都有不同的IDS和不同的CIDR条目.我想检查用户IP是否存在于任何CIDR中是否存在于特定框中.如果它存在则允许他进入否则不进入.假设用户IP是

127.0.0.1
Run Code Online (Sandbox Code Playgroud)

假设框12的CIDR条目是

192.168.1.20/27
192.168.0.10/32
Run Code Online (Sandbox Code Playgroud)

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

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

有什么想法吗?

谢谢

Wh1*_*Ck5 11

好的,试试这5个简单的步骤......

1.将您的CIDR存储到数组中(从数据库中读取它们;猜猜你知道怎么做到这一点)

$cidrs = array(
  '192.168.1.20/27', 
  '192.168.0.10/32'
  );
Run Code Online (Sandbox Code Playgroud)

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

$user_ip = $_SERVER['REMOTE_ADDR'];
Run Code Online (Sandbox Code Playgroud)

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), 0, $parts[1]);
  $ipu = explode('.', $user_ip);
  foreach ($ipu as &$v)
    $v = str_pad(decbin($v), 8, '0', STR_PAD_LEFT);
  $ipu = substr(join('', $ipu), 0, $parts[1]);
  return $ipu == $ipc;
  }
Run Code Online (Sandbox Code Playgroud)

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

$validaddr = false;
foreach ($cidrs as $addr)
  if (IPvsCIDR($user_ip, $addr)) {
    $validaddr = true;
    break;
    } 
Run Code Online (Sandbox Code Playgroud)

5.决定如何处理用户

if ($validaddr) {
  echo "CORRECT IP ADDRESS";
  }
else {
  echo "INCORRECT IP ADDRESS";
  }
Run Code Online (Sandbox Code Playgroud)

而已!

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

示例2(从功能完成工作)

function testUserIP($user_ip, $cidrs) {
  $ipu = explode('.', $user_ip);
  foreach ($ipu as &$v)
    $v = str_pad(decbin($v), 8, '0', 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), 8, '0', STR_PAD_LEFT);
    $ipc = substr(join('', $ipc), 0, $parts[1]);
    $ipux = substr($ipu, 0, $parts[1]);
    $res = ($ipc === $ipux);
    if ($res) break;
    }
  return $res;
  }
Run Code Online (Sandbox Code Playgroud)

用法:

$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
  }
Run Code Online (Sandbox Code Playgroud)