php:我的访客来自本地网络吗?

php:我的访客来自本地网络吗?,php,apache,networking,ip,local,Php,Apache,Networking,Ip,Local,我有一个带LAMP服务器的小型家庭网络。我从这两个话题中了解到: 及 有多种方法可以确定访问者的ip信息。但是,是否有可能使用PHP 100%确定我的访问者来自本地网络? 我想让我的网站在我的192.168.0.*网络上免费使用,并且不受任何人的密码保护。我也不担心偶尔会有来自本地网络的人因为使用代理或其他原因被迫提供额外凭证的情况。我只想100%确保外界的人会被要求输入密码 或者用其他措辞:对于我本地网络之外的潜在黑客,有没有可能欺骗Apache,使其认为访问者是本地的 通常,识别访客ip

我有一个带LAMP服务器的小型家庭网络。我从这两个话题中了解到:

有多种方法可以确定访问者的ip信息。但是,是否有可能使用PHP 100%确定我的访问者来自本地网络? 我想让我的网站在我的192.168.0.*网络上免费使用,并且不受任何人的密码保护。我也不担心偶尔会有来自本地网络的人因为使用代理或其他原因被迫提供额外凭证的情况。我只想100%确保外界的人会被要求输入密码

或者用其他措辞:对于我本地网络之外的潜在黑客,有没有可能欺骗Apache,使其认为访问者是本地的

通常,识别访客ip的任何努力都是为了定制网站的外观或语言,但出于上述安全原因,是否可以使用它?


<?php
/**
 * Check if a client IP is in our Server subnet
 *
 * @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));
}
?>

如果你能进行这样的设置,那么安全性取决于你的防火墙(如果你有防火墙的话)。在PHP上没有那么多

阅读IP欺骗。


更好的方法是将该Web服务器放在托管提供商上,并且只允许您的外部IP访问。不过,这也不是真正的100%安全。

这应该通过apache使用SUPPITE指令来完成。您必须确保在apache.conf中设置了AllowOverride,然后在.htaccess中可以执行以下操作(或者可以将其放在虚拟主机的指令中)

AuthType Basic
AuthName "Private Site"
AuthUserFile /etc/httpd/conf.d/htpasswd/www.example.com
Order deny,allow
Allow from 192.168.0.0/16
Deny from all
Require valid-user
Satisfy Any

他们可以绕过此问题的唯一方法是,他们以某种方式从内部网络代理进来。

使用两个虚拟主机配置apache。一个用于内部,一个用于外部。不要依赖PHP实现此目的。配置DNS以将内部用户定向到站点的内部IP,并将外部用户定向到外部IP。两个直接问题:>ip spoofing>php只有在它们已经连接后才会运行。为什么不总是请求密码?这样更简单、更安全。@mkaatman这不起作用。虚拟主机不会基于不同的接口分离。无论是通过内部ip连接到www.example.com,还是通过外部ip连接到www.example.com(无论它们是否是单独的接口),它总是会打开www.example.com虚拟主机。当然,询问密码是一个解决方案,但我的主要动机是好奇。我在php.net上看过这段代码,但问题不是是否可以读取或分类访问者ip,而是php的安全性如何?嗯,可能没有“安全度量”,但如果您想实现尽可能高的安全性,您可能需要查看并创建不同的intranet和extranet站点。服务器正在从我家的各种传感器(温度、湿度、光线等)收集数据,因此托管提供商不是一个真正的解决方案。而且我的IP不是静态的。无论如何,我认为我确信这是不可能的,或者至少在这件事上依靠PHP不是一个好主意。你可以在家里创建相同的设置,将你的服务器放在防火墙之外的DMZ中(可能有自己的防火墙)。然后只允许您的“lan”路由器的外部ip。但是基于ip的安全性通常不是一个好主意,是的。