1

我有一个带有 LAMP 服务器的小型家庭网络。我从这两个主题中知道:

如何确定访问者的ip?PHP:如何检查客户端是否是本地的?

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

或者换一种说法:对于我本地网络之外的潜在黑客,是否有可能欺骗 Apache 认为访问者是本地的?

通常,识别访问者 ip 的任何努力都是针对自定义网站的外观或语言,但是出于上述安全原因,是否可以使用它?

4

3 回答 3

2
<?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));
}
?>

资源

于 2013-03-01T23:10:25.843 回答
0

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

阅读 IP 欺骗。 IP 地址欺骗 - 维基百科

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

于 2013-03-01T23:12:00.333 回答
0

这应该使用满足指令从 apache 完成。您必须确保在您的 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

他们可以绕过这个的唯一方法是如果他们以某种方式从内部网络代理。

于 2013-03-02T01:40:20.050 回答