symfony 如何知道IP是否为外部IP?

ecr0jaav  于 2023-01-26  发布在  其他
关注(0)|答案(4)|浏览(159)

我想检测一个IP地址是本地的还是外部的。在一个Web应用程序中,我的客户希望通过本地网络上的桑巴舞直接访问文件,如果您不在网络中,则通过下载链接访问文件。
我可能只是检查我的IP是否为172.30.*.*,但如果我的客户切换到1 0.*.*.*或IPV6,它将不再工作。
我可以使用配置变量,所以客户可以随意更改它。我希望它是自动的,没有配置变量。
你会怎么做?

bvpmtnay

bvpmtnay1#

请更新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)
pjngdqdw

pjngdqdw2#

不幸的是,没有简单的方法可以肯定地确定这一点。请看我的评论中的一个有趣的例子。
在IPv4世界中,您可以尝试这样做:确定服务器的外部IP地址(例如使用http://ip-address.domaintools.com/myip.xml),并将其与客户端的套接字远程地址($_SERVER['REMOTE_ADDR'])进行比较。如果它们相同,则您运行在同一网络上,如果它们不同,则它是一个不同的网络。
在IPv6的世界里(正确部署的网络),没有私有网络这样的东西,任何地方的每个设备都有自己的公共IP地址。在这种情况下,确定您是否是本地设备的唯一方法是维护一个完整的本地设备列表。

sxpgvts3

sxpgvts33#

我假设您将内部定义为0个路由器跳数?
溶液使用日期:
How do I find my server's IP address in PHP(CLI)
动态地确定服务器的IP地址和网络掩码值。然后,您应该能够确定客户端是否是远程的。
如果内部网络包括路由子网(1个或多个路由器跳),我想不出任何方法来动态地进行检测,您需要静态地定义内部IP范围。

sg24os4d

sg24os4d4#

如果你想在SQL中检查它,你可以使用如下条件:

(INET_ATON(ip) & INET_ATON('255.0.0.0')) = INET_ATON('10.0.0.0') # 10.0.0.0/8
OR (INET_ATON(ip) & INET_ATON('255.0.0.0')) = INET_ATON('127.0.0.0')    # 127.0.0.0/8
OR (INET_ATON(ip) & INET_ATON('255.240.0.0')) = INET_ATON('172.16.0.0') # 172.16.0.0/12
OR (INET_ATON(ip) & INET_ATON('255.255.0.0')) = INET_ATON('192.168.0.0')    # 192.168.0.0/16
OR (INET_ATON(ip) & INET_ATON('240.0.0.0')) = INET_ATON('240.0.0.0')    # 240.0.0.0/4

相关问题