为啥我使用 PHP 的 $_SERVER 变量得到一个随机字符串作为 IP 地址?

Posted

技术标签:

【中文标题】为啥我使用 PHP 的 $_SERVER 变量得到一个随机字符串作为 IP 地址?【英文标题】:Why am I getting a random string as IP address with PHP's $_SERVER variable?为什么我使用 PHP 的 $_SERVER 变量得到一个随机字符串作为 IP 地址? 【发布时间】:2020-10-11 05:01:33 【问题描述】:

我正在使用 php 记录我的网站访问者的 IP 地址以及其他一些信息 ($content),以便计算访问者的数量。

我正在使用以下代码:

<?php
public static function logContent(array $content = null)
        try 

            $myFile = fopen("visitors.txt", "a");

            $txt = "IP: ";

            if (isset($_SERVER['HTTP_CLIENT_IP']))
                $ipAddress = $_SERVER['HTTP_CLIENT_IP'];
            else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
                $ipAddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
            else if (isset($_SERVER['HTTP_X_FORWARDED']))
                $ipAddress = $_SERVER['HTTP_X_FORWARDED'];
            else if (isset($_SERVER['HTTP_FORWARDED_FOR']))
                $ipAddress = $_SERVER['HTTP_FORWARDED_FOR'];
            else if (isset($_SERVER['HTTP_FORWARDED']))
                $ipAddress = $_SERVER['HTTP_FORWARDED'];
            else if (isset($_SERVER['REMOTE_ADDR']))
                $ipAddress = $_SERVER['REMOTE_ADDR'];
            else
                $ipAddress = 'UNKNOWN';

            $txt .= $ipAddress;
            $txt .= " Time: " . date("Y-m-d h:i:s", time());
            $txt .= "\n";

            if (!empty($content) && is_array($content)) 
                foreach ($content as $k => $v) 
                    $txt .= "$k : ";
                    $txt .= $v;
                    $txt .= "\n";
                
                $txt .= "\n";
            

            fwrite($myFile, $txt);
            fclose($myFile);
         catch (\Exception $e) 

        
    
?>

此代码运行良好。通常,我有如下条目:

IP: 36.80.227.XX Time: 2020-06-19 08:23:52

IP: 191.252.61.XX Time: 2020-06-19 11:25:02

IP: 191.252.61.XX Time: 2020-06-19 11:25:02

但是,我最近在我的日志中得到了以下条目。

IP: __test|O:21:"JDatabaseDrivermysqli":3:s:2:"fc";O:17:"JSimplepieFactory":0:s:21:"\0\0\0disconnectHandlers";a:1 :i:0;a:2:i:0;O:9:"SimplePie":5:s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:s:8: "feed_url";s:56:"die(md5(DIRECTORY_SEPARATOR));JFactory::getConfig();exit";s:19:"cache_name_function";s:6:"assert";s:5:"cache" ;b:1;s:11:"cache_class";O:20:"JDatabaseDriverMysql":0:i:1;s:4:"init";s:13:"\0\0\ 0connection";b:1;���� 时间: 2020-06-19 11:27:37

这是某种类似于 MySQL 注入的恶意注入攻击吗?

我是否需要注意任何可疑之处并修补我的 Apache 服务器以提高安全性?

【问题讨论】:

【参考方案1】:

据我所知,HTTP_X_FORWARDED_FOR 标头由客户端/代理 (wiki) 发送,您无需对 $_SERVER['HTTP_X_FORWARDED_FOR'] 的内容进行任何控制。

所以是的,有人尝试过 SQL 注入,但在这种情况下,它并不敏感(只是输出到文本文件中)。 您必须在输出到文件之前检查 $ipAddress 的内容(例如使用正则表达式或使用this)。

编辑:您可以通过以下方式重现此行为:

  curl -H 'X-Forwarded-For: 1.1.1.1' https://www.example.com/mypage
  curl -H 'X-Forwarded-For: <SOME RANDOM INPUT>' https://www.example.com/mypage

希望有帮助

【讨论】:

【参考方案2】:

这闻起来像是可能的注入攻击。您可能想参考this 进行更深入的了解。虽然这谈论的是 joomla 设置并与 2015 年有关,但签名值得一看。

我可能会建议您查看日志以查找任何可疑活动。

【讨论】:

以上是关于为啥我使用 PHP 的 $_SERVER 变量得到一个随机字符串作为 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

使用PHP预定义变量得到url地址及相关参数

$_SERVER变量 以及 PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题

PHP中为啥我获取不到$_SERVER["REMOTE_USER"]的值?

$_SERVER[]数组解析

为啥我得到 MySQLdb._exceptions.OperationalError: (2013, 'Lost connection to MySQL server during query')

为啥有些 PHP 安装有 $_SERVER['SCRIPT_URI'] 而其他没有?