|
<?php |
|
|
|
namespace JsonRPC\Validator; |
|
|
|
use JsonRPC\Exception\AccessDeniedException; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class HostValidator |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function validate(array $hosts, $remoteAddress) |
|
{ |
|
if (!empty($hosts)) { |
|
foreach ($hosts as $host) { |
|
if (self::ipMatch($remoteAddress, $host)) { |
|
return; |
|
} |
|
} |
|
throw new AccessDeniedException('Access Forbidden'); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function ipMatch($remoteAddress, $host) |
|
{ |
|
$host = trim($host); |
|
if (strpos($host, '/') !== false) { |
|
list($network, $mask) = explode('/', $host); |
|
if (self::netMatch($remoteAddress, $network, $mask)) { |
|
return true; |
|
} |
|
} |
|
|
|
if ($host === $remoteAddress) { |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static function netMatch($clientIp, $networkIp, $mask) |
|
{ |
|
$mask1 = 32 - $mask; |
|
return ((ip2long($clientIp) >> $mask1) == (ip2long($networkIp) >> $mask1)); |
|
} |
|
} |
|
|