我需要实现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."));
答案 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
}