Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何知道IP是否为外部IP?_Php_Symfony_Ip - Fatal编程技术网

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

Php 如何知道IP是否为外部IP?,php,symfony,ip,Php,Symfony,Ip,我希望检测IP地址是本地的还是外部的。在web应用程序中,我的客户希望通过本地网络上的samba直接访问文件,如果您不在网络中,则通过下载链接访问文件 我可以只检查我的IP是否为172.30.*.*.,但如果我的客户切换到10.*.*.*.或IPV6,它将不再工作 我可以使用配置变量,因此客户可以随意更改它。我希望它是自动的,没有配置变量 您将如何继续?根据需要更新IP范围列表。我已经有一段时间没有更新这个列表了,但它应该有最多的更新。抱歉,我从未向其添加IPv6支持 function rese

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

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

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


您将如何继续?

根据需要更新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)
功能保留\u ip($ip)
{
$reserved_ips=array(//不是详尽的列表
'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($ip\U保留ip作为$ip\U开始=>$ip\U结束)
{

如果($ip_long>=$ip_start)&($ip_long我假设您将内部定义为0路由器跳数

在以下位置使用解决方案:

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


如果内部网络包含路由子网(1个或多个路由器跳离),我想不出如何使检测动态化,您需要静态地定义内部IP范围。

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

在IPv4世界中,您可以尝试这样做:确定服务器的外部IP地址(例如使用),并将其与客户端的套接字远程地址进行比较(
$\u server['remote\u ADDR']
)。如果它们相同,则您运行在同一网络上,如果它们不同,则它是不同的网络


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

正常请求中没有任何内容会指示内部或外部来源。您只需输入IP地址即可请求中的nt。若要查看某个IP是否在同一网络上,请获取子网掩码,并对自己的IP执行位and。如果对另一个IP(使用子网掩码)执行相同的结果,则如果它们在同一网络(子网)上,则结果应相等@Matthew你可能会得到有趣的结果。想象一下,服务器运行在一个192.168.1.17的节点上,路由器向该节点发送到外部IP w.x.y.z端口80的请求。客户端来自192.168.1.37,它被NAT到其外部地址a.b.c.d,但实际地址相同,但节点位于不同的网络上.@Matthew Chameless self promotion:请参阅我对原始问题的评论:您可以让IP为内部,但客户端为外部-这取决于您的代理设置。@AleksG是一个有效点,但如果您有一个本地代理,您无论如何都有点麻烦-您必须配置代理,以便它通知您客户端IP,并使用该值进行配置测试-但此代码未耦合到
$\u服务器['REMOTE\u ADDR']
所以它仍然很有用。远程代理并不重要,因为它仍然是一个外部地址,检查仍然是一个有用的地址。这个解决方案似乎足够好,应该与我客户的网络策略配合使用。我想这个问题没有完美的解决方案。真的很有趣(+1)。我想我不能用你的方式。我的客户是法国政府。我知道他们不为(至少)一些vpn用户提供互联网接入。