如何检测用户是否在PHP本地主机?

换句话说,我怎么知道使用我的Web应用程序的人是否在它所在的服务器上? 如果我没有记错,PHPMyAdmin出于安全原因做了这样的事情。

您还可以使用$_SERVER['REMOTE_ADDR'] ,其中请求的客户端的IP地址由Web服务器提供。

 $whitelist = array( '127.0.0.1', '::1' ); if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){ // not valid } 

较新的操作系统用户(Win 7,8)也可能发现有必要在他们的白名单arrays中包含一个IPV6格式的远程地址:

 $whitelist = array('127.0.0.1', "::1"); if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){ // not valid } 

$_SERVER["REMOTE_ADDR"]应该告诉你用户的IP。 这是可欺骗的,但。

检查这个赏金问题的一个非常详细的讨论。

我想你对PHPMyAdmin的记忆是不同的:许多MySQL服务器被configuration为只能从本地主机访问才能出于安全原因。

作为一种补充,作为一种function…

 function is_localhost() { $whitelist = array( '127.0.0.1', '::1' ); if( in_array( $_SERVER['REMOTE_ADDR'], $whitelist) ) return true; } 

它似乎不应该使用$_SERVER['HTTP_HOST'] ,因为这是http头中的值,容易被伪造。

您也可以使用$_SERVER["REMOTE_ADDR"] ,这是更安全的值,但也有可能是假的。 这个remote_addr是Apache返回结果的地址。

如果你想有一个白名单/允许列表 ,支持静态IPdynamic名称

例如:

 $whitelist = array("localhost", "127.0.0.1", "devel-pc.ds.com", "liveserver.com"); if (!isIPWhitelisted($whitelist)) die(); 

这样你可以设置一个能够(肯定)被检测到的名称/ IP列表。 dynamic名称为从不同点访问提供了更多的灵活性。

在这里有两个常用的选项,你可以在你的本地主机文件中设置一个名字,或者你可以使用一个可以在任何地方find的dynamic名称提供者

这个函数的CACHES结果是因为gethostbyname是一个非常慢的函数。

对于这个pupose我已经实现了这个function:

 function isIPWhitelisted($whitelist = false) { if ( isset($_SESSION) && isset($_SESSION['isipallowed']) ) { return $_SESSION['isipallowed']; } // This is the whitelist $ipchecklist = array("localhost", "127.0.0.1", "::1"); if ($whitelist) $ipchecklist = $whitelist; $iplist = false; $isipallowed = false; $filename = "resolved-ip-list.txt"; $filename = substr(md5($filename), 0, 8)."_".$filename; // Just a spoon of security or just remove this line if (file_exists($filename)) { // If cache file has less than 1 day old use it if (time() - filemtime($filename) <= 60*60*24*1) $iplist = explode(";", file_get_contents($filename)); // Read cached resolved ips } // If file was not loaded or found -> generate ip list if (!$iplist) { $iplist = array(); $c=0; foreach ( $ipchecklist as $k => $iptoresolve ) { // gethostbyname: It's a VERY SLOW function. We really need to cache the resolved ip list $ip = gethostbyname($iptoresolve); if ($ip != "") $iplist[$c] = $ip; $c++; } file_put_contents($filename, implode(";", $iplist)); } if (in_array($_SERVER['REMOTE_ADDR'], $iplist)) // Check if the client ip is allowed $isipallowed = true; if (isset($_SESSION)) $_SESSION['isipallowed'] = $isipallowed; return $isipallowed; } 

为了获得更好的可靠性,可以将@Pekka在其post中提到的get_ip_address()replace$ _SERVER ['REMOTE_ADDR']作为“这个赏金问题”

我find了一个简单的答案。

由于所有本地驱动器都有C:或D:或F:等等

只要检测第二个字符是否是:

 if ( substr_compare(getcwd(),":",1,1) == 0) { echo '<script type="text/javascript">alert(" The working dir is at the local computer ")</script>'; $client_or_server = 'client'; } else { echo '<script type="text/javascript">alert(" The working dir is at the server ")</script>'; $client_or_server = 'server'; } 

如何比较$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']来确定客户端是否与服务器在同一台计算机上?