【问题标题】:PHP Warning: file_get_contents(http://ipecho.net/plain): failed to open stream: Connection timed out inPHP警告:file_get_contents(http://ipecho.net/plain):无法打开流:连接超时
【发布时间】:2024-04-13 04:20:02
【问题描述】:

我这里有一个错误,我不知道问题到底出在哪里。 我正在尝试制作一个 PHP 文件并拒绝任何人使用该脚本,除了我在代码中输入的 IP:

$pass = '192.168.x.x'; //here is the ip of the client
if (file_get_contents('http://ipecho.net/plain') !== $pass) {

当我使用代码时我有问题

PHP Warning:  file_get_contents(http://ipecho.net/plain): failed to open stream: Connection timed out

【问题讨论】:

  • allow_url_fopen 是否启用?
  • 获取到 URL 的内容了吗?防火墙等。如果是这样 - 内容是什么
  • 内容必须只是一个ip

标签: php warnings file-get-contents


【解决方案1】:

您为什么使用该网站来获取客户的 IP?

您可以使用这个 PHP 函数来获取客户端的 IP 地址。

只要应用程序位于代理(例如 Cloudflare)之后:

function get_client_ip() {
    $ipaddress = '';
    if ($_SERVER['HTTP_CLIENT_IP'])
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if($_SERVER['HTTP_X_FORWARDED_FOR'])
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if($_SERVER['HTTP_X_FORWARDED'])
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if($_SERVER['HTTP_FORWARDED_FOR'])
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if($_SERVER['HTTP_FORWARDED'])
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if($_SERVER['REMOTE_ADDR'])
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}

当应用程序不在代理之后:

function get_client_ip() {
    return $_SERVER['REMOTE_ADDR'];
}

最终代码应该是这样的:

$pass = '192.168.x.x'; //here is the ip of the client
if (strcmp(get_client_ip(),$pass) == 0 ) {

【讨论】:

  • 这是个坏建议。没有人必须在代理后面,只需发送一个 http 标头,他们就可以假装是本地主机。
  • 你是对的!此函数应始终用于代理后面的应用程序
  • 即使在代理之后,它仍然是不正确的。 Nginx、Cloudflare 等他们只是添加了多个 X-Forwarded-For 标头而不是删除源头,更不用说云部署中的内部代理了
【解决方案2】:
if (file_get_contents('http://ipecho.net/plain') !== $pass)

请注意,使用此代码您是在比较您的 SERVER 的 ip,而不是您的 CLIENT!

所以你的代码是错误的。另一个问题是使用'!==',你应该只在布尔类型而不是字符串上使用它 所以快速修复是:

if ($_SERVER['REMOTE_ADDR'] != $pass)

【讨论】: