如何检测用户是否在PHP中的localhost上?

Ric*_*uez 88 php localhost detection

换句话说,如何判断使用我的Web应用程序的人是否在其所在的服务器上?如果我没记错的话,PHPMyAdmin出于安全原因做了类似的事情.

mau*_*ris 157

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

$whitelist = array(
    '127.0.0.1',
    '::1'
);

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}
Run Code Online (Sandbox Code Playgroud)

  • @Pekka웃你可以发送例如`Host:127.0.0.1`并将它填入`HTTP_HOST`,所以它根本不是可靠的方法. (4认同)
  • 是的,这是一个糟糕的建议,目前的形式,需要编辑 - 或低估. (4认同)
  • @skcin7可能是您的服务器设置.核实. (3认同)
  • 不要忘记IPv6:`$ whitelist = array('127.0.0.1',':: 1');` (3认同)
  • 哪个会比欺骗IP更容易打破.你应该真的改变它. (2认同)

Jen*_*ell 21

作为补充,作为一种功能......

function isLocalhost($whitelist = ['127.0.0.1', '::1']) {
    return in_array($_SERVER['REMOTE_ADDR'], $whitelist);
}
Run Code Online (Sandbox Code Playgroud)

  • 作为良好的做法,我建议添加"else return false;" 这样函数总是返回一个布尔值.或者,只需完全删除"if"而改为"return in_array($ _SERVER ['REMOTE_ADDR'],$ whitelist);" (2认同)

Pek*_*ica 14

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

请查看此赏金问题,以获得非常详细的讨论.

我认为您使用PHPMyAdmin记住的是不同的东西:许多MySQL服务器都配置为只能出于安全原因从localhost访问它们.


ree*_*ogi 14

较新的OS用户(Win 7,8)也可能发现有必要在其白名单数组中包含IPV6格式的远程地址:

$whitelist = array('127.0.0.1', "::1");

if(!in_array($_SERVER['REMOTE_ADDR'], $whitelist)){
    // not valid
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*lad 11

我很抱歉,但所有这些答案对我来说似乎都很糟糕。我建议重新表述这个问题,因为从某种意义上说,所有机器都是“本地主机”。

问题应该是;如何根据在哪台机器上执行不同的代码路径来运行不同的代码路径。

在我看来,最简单的方法是创建一个名为 DEVMACHINE 或任何你真正想要的文件,然后简单地检查

file_exists('DEVMACHINE')

上传到实时托管环境时,请记住排除此文件!

这个解决方案不依赖于网络配置,它不能被欺骗,并且可以很容易地在运行“live-code”和“dev-code”之间切换。


nic*_*ola 6

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

您也可以使用$_SERVER["REMOTE_ADDR"],这是更安全的价值,但也可以伪造.这remote_addr是Apache返回结果的地址.