5

我希望检测地址 IP 是本地的还是外部的。在 Web 应用程序中,我的客户希望通过本地网络上的 samba 直接访问文件,如果您不在网络中,则通过下载链接访问文件。

我可能只是检查我的 IP 是否为,但如果我的客户切换到 1或 IPV6 172.30.*.*,它将不再起作用。0.*.*.*

我可能会使用配置变量,因此客户可以随意更改它。我希望它是自动的,没有配置变量。

你将如何进行?

4

3 回答 3

9

根据需要更新 IP 范围列表。我有一段时间没有更新这个列表,但它应该有最多。抱歉,我从未向它添加 IPv6 支持。

function reserved_ip($ip)
{
    $reserved_ips = array( // not an exhaustive list
    '167772160'  => 184549375,  /*    10.0.0.0 -  10.255.255.255 */
    '3232235520' => 3232301055, /* 192.168.0.0 - 192.168.255.255 */
    '2130706432' => 2147483647, /*   127.0.0.0 - 127.255.255.255 */
    '2851995648' => 2852061183, /* 169.254.0.0 - 169.254.255.255 */
    '2886729728' => 2887778303, /*  172.16.0.0 -  172.31.255.255 */
    '3758096384' => 4026531839, /*   224.0.0.0 - 239.255.255.255 */
    );

    $ip_long = sprintf('%u', ip2long($ip));

    foreach ($reserved_ips as $ip_start => $ip_end)
    {
        if (($ip_long >= $ip_start) && ($ip_long <= $ip_end))
        {
            return TRUE;
        }
    }
    return FALSE;
}

var_dump(reserved_ip('127.0.0.1')); // reserved (localhost)
var_dump(reserved_ip('74.125.140.101')); // not reserved (Google)
于 2013-01-02T16:51:34.040 回答
3

不幸的是,没有简单的方法可以确定地确定这一点。请参阅我的评论以获取一个有趣的示例。

在 IPv4 世界中,您可以尝试这样做:确定服务器的外部 IP 地址(例如使用http://ip-address.domaintools.com/myip.xml)并将其与客户端的套接字远程地址($_SERVER['REMOTE_ADDR'])进行比较。如果它们是相同的,那么你在同一个网络上运行,如果它们不同,那么它是一个不同的网络。

在 IPv6 世界(正确部署的网络)中,没有专用网络之类的东西,任何地方的每个设备都有自己的公共 IP 地址。在这种情况下,确定您是否在本地的唯一方法是维护本地设备的完整列表。

于 2013-01-02T17:06:59.450 回答
0

我假设您将内部定义为 0 个路由器跳数?

使用以下解决方案:

如何在 PHP(CLI) 中找到我的服务器的 IP 地址

动态确定服务器的 IP 地址和网络掩码值。然后你应该能够确定客户端是否是远程的。

如果内部网络包括路由子网(1 个或多个路由器跳),我无论如何都无法使检测动态化,您需要静态定义内部 IP 范围。

于 2013-01-02T16:52:51.010 回答