我为我工作的公司创建了一个网站。
我想使用子网掩码限制对用户预设的访问。这可以用 PHP 吗?IP 是已知的。
问问题
3747 次
3 回答
0
这很简单:给定 IP 地址的“子网”掩码是255.255.255.255
.
子网掩码与子网一起定义了一个 IP 地址范围。
因此,要从 IP 地址收集子网掩码,您需要子网。
我上面有点讽刺的回答假设子网和IP地址是相同的。哪种技术是不可能的,因为所有 4x255 位都用于子网,并且没有更多位可用于任何 IP 地址。
于 2012-11-16T17:12:16.860 回答
-1
我相信这可能会做你想要实现的目标:
见http://php.net/manual/en/function.ip2long.php
<?php
/**
* Check if a client IP is in our Server subnet
*
* @author david dot schueler at tel-billig dot de
* @param string $client_ip
* @param string $server_ip
* @return boolean
*/
function clientInSameSubnet($client_ip=false,$server_ip=false) {
if (!$client_ip)
$client_ip = $_SERVER['REMOTE_ADDR'];
if (!$server_ip)
$server_ip = $_SERVER['SERVER_ADDR'];
// Extract broadcast and netmask from ifconfig
if (!($p = popen("ifconfig","r"))) return false;
$out = "";
while(!feof($p))
$out .= fread($p,1024);
fclose($p);
// This is because the php.net comment function does not
// allow long lines.
$match = "/^.*".$server_ip;
$match .= ".*Bcast:(\d{1,3}\.\d{1,3}i\.\d{1,3}\.\d{1,3}).*";
$match .= "Mask:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/im";
if (!preg_match($match,$out,$regs))
return false;
$bcast = ip2long($regs[1]);
$smask = ip2long($regs[2]);
$ipadr = ip2long($client_ip);
$nmask = $bcast & $smask;
return (($ipadr & $smask) == ($nmask & $smask));
}
?>
于 2012-11-16T17:19:39.370 回答