如何使用 FILTER_VALIDATE_IP 限制 IP 地址范围



我需要实现IP地址过滤系统,以便只有授权的IP地址才能访问某些资源。我目前使用 FILTER_VALIDATE_IP 和 filter_var 来验证 IP 地址。

我面临的问题是开始和结束 ip 可以是 1.1.1.1.1 和 99.99.99.99,这显然击败了过滤系统的 WHO 原因。我需要的是起始 IP 地址,例如 1.1.1.1.1,但只能更改结束 IP 地址的最后一位数字,例如 1.1.1.9,否则无法保存。

我包含了下面的一些代码:

if($_POST["lastip"]=='unavailable'  || $_POST['lastip']==''  || filter_var($_POST['lastip'], FILTER_VALIDATE_IP)) {
if($_POST["startip"]=='unavailable' || $_POST['startip']=='' || filter_var($_POST['startip'], FILTER_VALIDATE_IP)){
        $this->db->update("user", array("startip" => "?"), array("id" =>$user->id ), array($_POST['startip']));
        Main::redirect("user/tools", array("success", "Your authorisation settings have been updated successfully."));
    }else{
  Main::redirect("user/tools", array("danger", "The starting authorised IP address is not valid. Please try again."));
    }
}else{
Main::redirect("user/tools", array("danger", "The ending authorised IP address is not valid. Please try again."));

代码:

<?php
function inIpRagne($ip, $ipLowerRange, $ipUpperRange) {
    $pattern = '/(d+).(d+).(d+).(d+).(d+)/';
    preg_match($pattern, $ip, $ipArr);
    preg_match($pattern, $ipLowerRange, $ipLowerRangeArr);
    preg_match($pattern, $ipUpperRange, $ipUpperRangeArr);
    array_shift($ipArr);
    array_shift($ipLowerRangeArr);
    array_shift($ipUpperRangeArr);
    foreach($ipArr as $index => $digit) {
        if($digit < $ipLowerRangeArr[$index] || $digit > $ipUpperRangeArr[$index]) {
            return false;
        }
    }
    return true;
}
//ip not in range = false
$ip = '1.2.3.4.5';
$ipLowerRange = '1.1.1.1.1';
$ipUpperRange = '1.1.1.1.1';
$result = inIpRagne($ip, $ipLowerRange, $ipUpperRange);
var_dump($result);
//ip in range = true
$ip = '1.2.3.4.5';
$ipLowerRange = '1.1.1.1.1';
$ipUpperRange = '1.2.3.4.5';
$result = inIpRagne($ip, $ipLowerRange, $ipUpperRange);
var_dump($result);
//ip not in range = false
$ip = '1.1.1.1.10';
$ipLowerRange = '1.1.1.1.1';
$ipUpperRange = '1.1.1.1.9';
$result = inIpRagne($ip, $ipLowerRange, $ipUpperRange);
var_dump($result);
//ip in range = tue
$ip = '1.1.1.1.9';
$ipLowerRange = '1.1.1.1.1';
$ipUpperRange = '1.1.1.1.9';
$result = inIpRagne($ip, $ipLowerRange, $ipUpperRange);
var_dump($result);

结果:

bool(false)
bool(true)
bool(false)
bool(true)

如何使用:

if(inIpRagne($ip, $ipLowerRange, $ipUpperRange)) {
    //ip is allowed - do your stuff
} else {
    //ip is not allowed
}

最新更新