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

时间:2019-06-01 20:29:52

标签: php html

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

我面临的问题是开始和结束ip可以是1.1.1.1.1,而99.99.99.99显然可以克服过滤系统的原因。我需要的是起始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."));

1 个答案:

答案 0 :(得分:0)

代码:

<?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
}