换句话说,如何确定使用我的Web应用程序的人是否在其所在的服务器上?如果我没记错的话,出于安全原因,PHPMyAdmin会执行类似的操作。
换句话说,如何确定使用我的Web应用程序的人是否在其所在的服务器上?如果我没记错的话,出于安全原因,PHPMyAdmin会执行类似的操作。
Answers:
您还可以使用$_SERVER['REMOTE_ADDR']
Web服务器指定客户端请求的IP地址。
$whitelist = array(
'127.0.0.1',
'::1'
);
if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
// not valid
}
Host: 127.0.0.1
,它将被填充到中HTTP_HOST
,所以这根本不是可靠的方法。
$whitelist = array('127.0.0.1', '::1');
$_SERVER["REMOTE_ADDR"]
应该告诉您用户的IP。但是,这是可欺骗的。
检查这个赏金问题进行非常详细的讨论。
我认为您对PHPMyAdmin的了解与众不同:配置了许多MySQL服务器,以便出于安全原因只能从本地主机访问它们。
似乎您不应该使用$_SERVER['HTTP_HOST']
,因为这是http标头中的值,很容易伪造。
您也可以使用$_SERVER["REMOTE_ADDR"]
,这是更安全的值,但也可能伪造。这remote_addr
是Apache返回结果的地址。
REMOTE_ADDR
可以伪造,但是如果您想将其伪造为127.0.0.1
或 ::1
,则需要对机器进行折衷,而对于这种机器,欺骗REMOTE_ADDR
最少的是您。相关答案-stackoverflow.com/a/5092951/3774582
如果要拥有一个支持静态IP和动态名称的白名单/允许列表。
例如:
$whitelist = array("localhost", "127.0.0.1", "devel-pc.ds.com", "liveserver.com");
if (!isIPWhitelisted($whitelist)) die();
这样,您可以设置一个名称/ IP列表,这些列表将能够(肯定)被检测到。动态名称为从不同点访问提供了更大的灵活性。
您在此处有两个常用选项,可以在本地主机文件中设置一个名称,也可以只使用一个可在任何地方找到的动态名称提供程序。
由于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地址。
我找到了一个简单的答案。
因为所有本地驱动器都有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';
}