我有一个带LAMP服务器的小型家庭网络。我从这两个主题中了解到:
How to make sure about the ip of the visitor? 和 PHP: how to check if the client is local?
有多种方法可以确定有关访问者ip的一些信息。但是有可能使用PHP来100%确定我的访问者是否来自本地网络? 我想让我的网站免费提供我的192.168.0。*网络和密码保护免受其他人的影响。而且我并不担心由于使用代理或其他原因而偶尔会有来自我本地网络的人被迫提供额外凭据的情况。我只想100%确保外部人员被要求输入密码。
或许还有一些其他措辞:对于我本地网络之外的潜在黑客,是否有可能欺骗Apache认为访问者是本地的?
通常,识别访问者ip的任何努力都是针对自定义网站的外观或语言,但是出于上述安全原因可以使用它吗?
答案 0 :(得分: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));
}
?>
答案 1 :(得分:0)
如果您可以进行安全设置,那么安全取决于您的防火墙。与PHP无关。
了解IP欺骗。 IP address spoofing - Wikipedia
更好的方法是将该网络服务器放在托管服务提供商上,只允许外部IP访问。但这仍然不是100%安全。
答案 2 :(得分:0)
这应该通过使用satisf指令从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
他们可以绕过这一点的唯一方法是,如果他们以某种方式从内部网络代理。