我需要实现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
}