dxw/cidr

IP地址与CIDR范围的匹配


README

PHP库,用于匹配IP地址与CIDR范围。

支持IPv4和IPv6。

安装

composer require dxw/cidr

用法

简单匹配两个地址

$result = \Dxw\CIDR\IP::contains('2001:db8:123::/64', '2001:db8:123::42');
if ($result->isErr()) {
    // handle the error
}
$match = $result->unwrap();

if ($match) {
    echo "The addresses match!\n";
} else {
    echo "The addresses don't match.\n";
}

注意

IPv4兼容的IPv6地址和IPv4映射的IPv6地址部分支持。

形如 ::127.0.0.1::ffff:127.0.0.1 的地址将被解析。但只有当它们位于 ::/96::ffff:0:0/96 范围内时。例如,2001:db8::127.0.0.1 将被拒绝。

但解析出的地址将被视为IPv6地址,因此它永远不会与IPv4地址匹配。例如,127.0.0.1 永远不会匹配 ::ffff:127.0.0.1::127.0.0.1

API

测试IPv6地址是否位于特定IPv6范围内的示例

$result = \Dxw\CIDR\IPv6Range::Make('2001:db8:123::/64');
if ($result->isErr()) {
    // handle the error
}
$range = $result->unwrap();

$result = \Dxw\CIDR\IPv6Address::Make('2001:db8:123::42');
if ($result->isErr()) {
    // handle the error
}
$address = $result->unwrap();

if ($range->containsAddress($address)) {
    echo "It matches!\n";
} else {
    echo "It doesn't match.\n";
}

要使示例仅适用于IPv4,请将 IPv6 替换为 IPv4。要使示例版本无关,请将 IPv6 替换为仅 IP

  • IP
    • ::contains(string $addressOrRange, string $address): \Dxw\Result\Result<bool>
  • IPAddress
    • ::Make(string $address): \Dxw\Result\Result<AddressBase> (AddressBaseIPv4AddressIPv6Address 的抽象超类)
  • IPRange
    • ::Make(string $range): \Dxw\Result\Result<RangeBase> (RangeBaseIPv4RangeIPv6Range 的抽象超类)
  • IPv4Address
    • ::Make(string $address): \Dxw\Result\Result<IPv4Address>
    • ::FromBinary(\phpseclib\Math\BigInteger $binary): \Dxw\Result\Result<IPv4Address>
    • ->__toString(): string
    • ->getBinary(): \phpseclib\Math\BigInteger
  • IPv6Address
    • ::Make(string $address): \Dxw\Result\Result<IPv6Address>
    • ::FromBinary(\phpseclib\Math\BigInteger $binary): \Dxw\Result\Result<IPv6Address>
    • ->__toString(): string
    • ->getBinary(): \phpseclib\Math\BigInteger
  • IPv4Block
    • ::Make(int $value): \Dxw\Result\Result<IPv4Block>
    • ->__toString(): string
    • ->getValue(): int
    • ->getNetmask(): \phpseclib\Math\BigInteger
  • IPv6Block
    • ::Make(int $value): \Dxw\Result\Result<IPv6Block>
    • ->__toString(): string
    • ->getValue(): int
    • ->getNetmask(): \phpseclib\Math\BigInteger
  • IPv4Range
    • ::Make(string $range): \Dxw\Result\Result<IPv4Range>
    • ->__toString(): string
    • ->getAddress(): \Dxw\CIDR\IPv4Address
    • ->getBlock(): \Dxw\CIDR\IPv4Block
    • ->containsAddress(\Dxw\CIDR\AddressBase $address): bool
  • IPv6Range
    • ::Make(string $range): \Dxw\Result\Result<IPv6Range>
    • ->__toString(): string
    • ->getAddress(): \Dxw\CIDR\IPv6Address
    • ->getBlock(): \Dxw\CIDR\IPv6Block
    • ->containsAddress(\Dxw\CIDR\AddressBase $address): bool