Другими словами, как узнать, находится ли человек, использующий мое веб-приложение, на сервере, на котором оно находится? Если я правильно помню, PHPMyAdmin делает что-то подобное из соображений безопасности.
Как я могу определить, находится ли пользователь на локальном хосте в PHP?
Ответы (10)
Вы также можете использовать $_SERVER['REMOTE_ADDR']
, для которого IP-адрес запрашивающего клиента предоставляется веб-сервером.
$whitelist = array(
'127.0.0.1',
'::1'
);
if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
// not valid
}
Host: 127.0.0.1
, и он будет заполнен в HTTP_HOST
, так что это вообще ненадежный метод.
- person Dejan Marjanović; 19.03.2013
$whitelist = array('127.0.0.1', '::1');
- person CrazyMax; 19.02.2014
filter_input(INPUT_SERVER, 'REMOTE_ADDR')
вместо $_SERVER['REMOTE_ADDR']
.
- person ban-geoengineering; 26.04.2017
Как дополнение, как функция...
function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}
Пользователи более новых ОС (Win 7, 8) также могут счесть необходимым включить удаленный адрес в формате IPV6 в свой массив белого списка:
$whitelist = array('127.0.0.1', "::1");
if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
// not valid
}
$_SERVER["REMOTE_ADDR"]
должен сообщить вам IP-адрес пользователя. Однако это подделка.
Проверьте < strong>этот вопрос о щедрости для очень подробного обсуждения.
Я думаю, что вы помните с PHPMyAdmin, это нечто другое: многие серверы MySQL настроены так, что к ним можно получить доступ только с локального хоста из соображений безопасности.
Извините, но все эти ответы кажутся мне ужасными. Я бы предложил перефразировать вопрос, потому что в некотором смысле все машины являются «локальными».
Вопрос должен быть; Как запустить разные пути кода в зависимости от того, на какой машине он выполняется.
На мой взгляд, самый простой способ - создать файл с именем DEVMACHINE или как вы хотите, а затем просто проверить
file_exists('DEVMACHINE')
Не забудьте исключить этот файл при загрузке в среду живого хостинга!
Это решение не зависит от конфигурации сети, его нельзя подделать и оно позволяет легко переключаться между работающим «живым кодом» и «дев-кодом».
Кажется, вам не следует использовать $_SERVER['HTTP_HOST']
, потому что это значение в заголовке http, которое легко подделать.
Вы также можете использовать $_SERVER["REMOTE_ADDR"]
, это более безопасное значение, но его также можно подделать. Этот remote_addr
является адресом, на который Apache возвращает результат.
REMOTE_ADDR
можно подделать, однако, если вы хотите подделать его как 127.0.0.1
или ::1
, для этого потребуется скомпрометировать машину, а поддельный REMOTE_ADDR
- наименьшая из ваших забот. Соответствующий ответ - stackoverflow.com/a/5092951/3774582
- person Goose; 16.11.2016
Если вы хотите иметь белый/белый список, который поддерживает статические 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 упомянул в своем опубликовать как "этот вопрос о вознаграждении"
Как насчет сравнения $_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']
, чтобы определить, находится ли клиент на той же машине, что и сервер?
$_SERVER['SERVER_ADDR']
не всегда надежно возвращает адрес сервера, например, при использовании балансировщиков нагрузки он возвращает IP-адрес балансировщика нагрузки, я полагаю.
- person Mike W; 29.08.2018
Использовал это простое условие PHP
if($_SERVER['HTTP_HOST'] == 'localhost')
{
die('Localhost');
}
Я нашел простой ответ.
Потому что все локальные диски имеют 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';
}