Как определить, находится ли пользователь на локальном хосте в PHP?

Другими словами, как я могу узнать, находится ли человек, использующий мое веб-приложение, на сервере, на котором он находится? Если я правильно помню, PHPMyAdmin делает что-то подобное по соображениям безопасности.

Вы также можете использовать $_SERVER['REMOTE_ADDR'] для которого IP-адрес запрашивающего клиента предоставляется веб-сервером.

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

$_SERVER["REMOTE_ADDR"] должен указать IP-адрес пользователя. Тем не менее, это подделано.

Проверьте этот вопрос о щедрости для очень подробного обсуждения.

Я думаю, что то, что вы помните, с PHPMyAdmin – это нечто другое: многие серверы MySQL настроены так, что к ним можно получить доступ только из localhost по соображениям безопасности.

Более новые пользователи ОС (Win 7, 8) также могут потребовать включения удаленного адреса IPV6 в свой белый список:

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

В качестве дополнения, как функции …

 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 возвращает результат.

Если вы хотите иметь белый список / список разрешений , поддерживающий статические IP-адреса и динамические имена .

Например:

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

Таким образом, вы можете установить список имен / IP-адресов, которые будут (наверняка) обнаружены. Динамические имена добавляют большую гибкость для доступа из разных точек.

Здесь у вас есть два общих варианта: вы можете установить имя в файле локальных хостов или просто использовать один динамический поставщик имен, который можно найти где угодно.

Эта функция CACHES приводит к тому, что gethostbyname является очень медленной функцией.

Для этого кукольника я реализовал эту функцию:

 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; } 

Для лучшей надежности вы можете заменить $ _SERVER ['REMOTE_ADDR'] для get_ip_address (), которую @Pekka упомянул в своем посте как «этот вопрос о щедрости»,

Я нашел легкий ответ.

Поскольку все локальные диски имеют 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'] чтобы определить, находится ли клиент на том же компьютере, что и сервер?