PDA

View Full Version : سوال: اعتبارسنجی CIDR



crafcrab
یک شنبه 09 آذر 1393, 22:04 عصر
سلام
میخواستم ببینم چصوری میشه با php به تابع طراحی کرد که یک CIDR به عنوان ورودی بگیره و در خروجی بگه این CIDR معتبر هست یا نه!

برای مثال :
10.113.0.0/14 یا 10.113.1.1/25 رو بهش بدی میگه نامعتربه
اگر 10.113.1.0/25 بهش بدی میگه معتبره

مانند سایت زیر :
http://ipduh.com/ip/cidr/

us1234
دوشنبه 10 آذر 1393, 10:51 صبح
فریم ورک زند آماده داره .

به این کلاس نگاه کن به سادگی قابل پیاده سازی است :

http://framework.zend.com/svn/framework/extras/incubator/library/ZendX/Whois/Adapter/Cidr.php

Unique
دوشنبه 10 آذر 1393, 15:25 عصر
این تابع مربوط به Zend که دوستمون گفتند :


function _cidrMatch($cidr, $ip)
{
// Get the base and the bits from the CIDR
list($base, $bits) = explode('/', $cidr);

// Now split it up into it's classes
list($a, $b, $c, $d) = explode('.', $base);

// Now do some bit shifting/switching to convert to ints
$i = ($a << 24) + ($b << 16) + ($c << 8) + $d;
$mask = $bits == 0 ? 0: (~0 << (32 - $bits));

// Here's our lowest int
$low = $i & $mask;

// Here's our highest int
$high = $i | (~$mask & 0xFFFFFFFF);

// Now split the ip we're checking against up into classes
list($a, $b, $c, $d) = explode('.', $ip);

// Now convert the ip we're checking against to an int
$check = ($a << 24) + ($b << 16) + ($c << 8) + $d;

// If the ip is within the range, including highest/lowest values,
// then it's witin the CIDR range
if ($check >= $low && $check <= $high) {
return true;
} else {
return false;
}
}

این هم یکی دیگه :


function valid_ip_cidr($cidr, $must_cidr = false)
{
if (!preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(\/[0-9]{1,2})?$/", $cidr))
{
$return = false;
} else
{
$return = true;
}
if ($return == true)
{
$parts = explode("/", $cidr);
$ip = $parts[0];
$netmask = $parts[1];
$octets = explode(".", $ip);
foreach ($octets as $octet)
{
if ($octet > 255)
{
$return = false;
}
}
if ((($netmask != "") && ($netmask > 32) && !$must_cidr) || (($netmask == ""||$netmask > 32) && $must_cidr))
{
$return = false;
}
}
return $return;
}

crafcrab
دوشنبه 10 آذر 1393, 17:55 عصر
تشکر دوستان ولی یک سوال
چرا دو تا ورودی داره میگیره ؟!

_cidrMatch($cidr, $ip)
ما فقط CIDR رو به تابع باید بدیم مثلا 10.113.1.1/25 تو پارامتر دوم ip چی رو باید بدیم!!!

us1234
دوشنبه 10 آذر 1393, 22:53 عصر
تشکر دوستان ولی یک سوال
چرا دو تا ورودی داره میگیره ؟!

_cidrMatch($cidr, $ip)
ما فقط CIDR رو به تابع باید بدیم مثلا 10.113.1.1/25 تو پارامتر دوم ip چی رو باید بدیم!!!

تابع زند چک می کند که IP داخل آن cidr وارد شده وجود دارد یا خیر .

از تابع @Unique استفاده کنید .