<?php
function checkIpWhitelist($ranges, $ip) {
foreach ($ranges as $range) {
if (isIpInRange($range, $ip)) return true;
}
return false;
}
function isIpInRange($rangeString, $ip) {
throw new InvalidArgumentException('Provide a valid ip address, please. "'.$ip.'" is not valid');
}
if (!preg_match('!^\d+(/\d+)?\.\d+(/\d+)?\.\d+(/\d+)?\.\d+(/\d+)?$!', $rangeString)) { throw new InvalidArgumentException('Provide a valid range, please. "'.$rangeString.'" is not valid');
}
if (count($parts) == 1) $parts[1] = $parts[0];
for ($i = 0; $i < 4; $i++) {
// negative and non-numbers caught by the regular expression
if ($range[$i][0] > $range[$i][1] || $range[$i][0] > 255 || $range[$i][1] > 255) {
throw new InvalidArgumentException('Provide a valid range, please. "'.$rangeString.'" is not valid');
}
}
for ($i = 0; $i < 4; $i++) {
if (!($range[$i][0] <= $ip[$i] && $ip[$i] <= $range[$i][1])) return false;
}
return true;
}
$yIp = '192.168.59.3';
'192.168.60.1',
'192.168.0/50.3',
'192.160/170.59.4'
),
'192.168.60.1',
'192.168.0/50.3',
'192.160/170.59.3',
'192.168.59.3'
),
'192.168.60.1',
'192.168.0/50.3',
'192.160/167.59.3',
'190/193.160/169.50/60.0/5',
'192.168.59.3'
)
);
foreach($whitelist as $list){
var_dump("\n\n" . (checkIpWhitelist
($list, $yIp) ?
'IP in range!' : 'IP not in range') . "\n\n"); }
?>
PD9waHAKCmZ1bmN0aW9uIGNoZWNrSXBXaGl0ZWxpc3QoJHJhbmdlcywgJGlwKSB7CiAgICBmb3JlYWNoICgkcmFuZ2VzIGFzICRyYW5nZSkgewogICAgICAgIGlmIChpc0lwSW5SYW5nZSgkcmFuZ2UsICRpcCkpIHJldHVybiB0cnVlOwogICAgfQoKICAgIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gaXNJcEluUmFuZ2UoJHJhbmdlU3RyaW5nLCAkaXApIHsKICAgIGlmICghZmlsdGVyX3ZhcigkaXAsIEZJTFRFUl9WQUxJREFURV9JUCkpIHsKICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQcm92aWRlIGEgdmFsaWQgaXAgYWRkcmVzcywgcGxlYXNlLiAiJy4kaXAuJyIgaXMgbm90IHZhbGlkJyk7CiAgICB9CgogICAgaWYgKCFwcmVnX21hdGNoKCchXlxkKygvXGQrKT9cLlxkKygvXGQrKT9cLlxkKygvXGQrKT9cLlxkKygvXGQrKT8kIScsICRyYW5nZVN0cmluZykpIHsKICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQcm92aWRlIGEgdmFsaWQgcmFuZ2UsIHBsZWFzZS4gIicuJHJhbmdlU3RyaW5nLiciIGlzIG5vdCB2YWxpZCcpOwogICAgfQoKICAgICRyYW5nZSA9IGFycmF5X21hcChmdW5jdGlvbiAoJGl0ZW0pIHsKICAgICAgICAkcGFydHMgPSBleHBsb2RlKCcvJywgJGl0ZW0pOwogICAgICAgIGlmIChjb3VudCgkcGFydHMpID09IDEpICRwYXJ0c1sxXSA9ICRwYXJ0c1swXTsKCiAgICAgICAgcmV0dXJuIGFycmF5X21hcCgnaW50dmFsJywgJHBhcnRzKTsKICAgIH0sIGV4cGxvZGUoJy4nLCAkcmFuZ2VTdHJpbmcpKTsKCiAgICBmb3IgKCRpID0gMDsgJGkgPCA0OyAkaSsrKSB7CiAgICAgICAgLy8gbmVnYXRpdmUgYW5kIG5vbi1udW1iZXJzIGNhdWdodCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uCiAgICAgICAgaWYgKCRyYW5nZVskaV1bMF0gPiAkcmFuZ2VbJGldWzFdIHx8ICRyYW5nZVskaV1bMF0gPiAyNTUgfHwgJHJhbmdlWyRpXVsxXSA+IDI1NSkgewogICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQcm92aWRlIGEgdmFsaWQgcmFuZ2UsIHBsZWFzZS4gIicuJHJhbmdlU3RyaW5nLiciIGlzIG5vdCB2YWxpZCcpOwogICAgICAgIH0KICAgIH0KCiAgICAkaXAgPSBleHBsb2RlKCcuJywgJGlwKTsKICAgIGZvciAoJGkgPSAwOyAkaSA8IDQ7ICRpKyspIHsKICAgICAgICBpZiAoISgkcmFuZ2VbJGldWzBdIDw9ICRpcFskaV0gJiYgJGlwWyRpXSA8PSAkcmFuZ2VbJGldWzFdKSkgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7Cn0KCgokeUlwID0gJzE5Mi4xNjguNTkuMyc7CiR3aGl0ZWxpc3QgPSBhcnJheSgKCWFycmF5KAoJCScxOTIuMTY4LjYwLjEnLAoJCScxOTIuMTY4LjAvNTAuMycsCgkJJzE5Mi4xNjAvMTcwLjU5LjQnCgkpLAoJYXJyYXkoCgkJJzE5Mi4xNjguNjAuMScsCgkJJzE5Mi4xNjguMC81MC4zJywKCQknMTkyLjE2MC8xNzAuNTkuMycsCgkJJzE5Mi4xNjguNTkuMycKCSksCglhcnJheSgKCQknMTkyLjE2OC42MC4xJywKCQknMTkyLjE2OC4wLzUwLjMnLAoJCScxOTIuMTYwLzE2Ny41OS4zJywKCQknMTkwLzE5My4xNjAvMTY5LjUwLzYwLjAvNScsCgkJJzE5Mi4xNjguNTkuMycKCSkKKTsKCmZvcmVhY2goJHdoaXRlbGlzdCBhcyAkbGlzdCl7Cgl2YXJfZHVtcCgiXG5cbiIgLiAoY2hlY2tJcFdoaXRlbGlzdCgkbGlzdCwgJHlJcCkgPyAnSVAgaW4gcmFuZ2UhJyA6ICdJUCBub3QgaW4gcmFuZ2UnKSAuICJcblxuIik7Cn0KPz4=