0

我为我工作的公司创建了一个网站。
我想使用子网掩码限制对用户预设的访问。这可以用 PHP 吗?IP 是已知的。

4

3 回答 3

3

你问问题的方式?不可以。您无法从服务器端确定客户端的子网掩码。

但是,您可以在服务器端定义自己的网络和掩码,以匹配客户端 IP,以确定是否授予访问权限。您应该首先阅读子网的工作原理,然后使用ip2long()函数和按位运算来授予对特定网段的访问权限。

老实说,大多数情况下,当您希望通过 IP 地址限制访问时,您会希望在网络/防火墙级别执行此操作,而不是在应用程序中执行此操作。

于 2012-11-16T17:33:27.430 回答
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 回答