【问题标题】:PHP Server unable to find real IPPHP Server 找不到真实 IP
【发布时间】:2017-04-26 12:02:46
【问题描述】:

我正在运行一个 Elastic Beanstalk 环境、一个负载均衡器以及运行 symfony2 应用程序的实例。

我无法获取真正的访问者 IP 地址,如果我在 app.php 中将其设置为信任代理,$request->getClientIP() 返回 null,如下所示:

请求::setTrustedProxies(array($request->server->get('REMOTE_ADDR')));

我得到了奇怪的多播地址:

172.31.25.85

172.31.25.85

172.31.42.183

等等。

这是我在 ssl.conf 中的 SSL 终止

ProxyPass / http://localhost:80/ retry=0
ProxyPassReverse / http://localhost:80/
ProxyPreserveHost on
RequestHeader set X-Forwarded-Proto "https" early

这是我的 $_SERVER 转储

Array (
    [REDIRECT_COMPOSER_HOME] => /root
    [REDIRECT_PHP_MEMORY_LIMIT] => 512M
    [REDIRECT_PHP_MAX_EXECUTION_TIME] => 60
    [REDIRECT_PHP_DISPLAY_ERRORS] => Off
    [REDIRECT_PHP_COMPOSER_OPTIONS] =>
    [REDIRECT_PHP_ALLOW_URL_FOPEN] => On
    [REDIRECT_PHP_ZLIB_OUTPUT_COMPRESSION] => Off
    [REDIRECT_PHP_DOCUMENT_ROOT] => /web/
    [REDIRECT_PHP_DATE_TIMEZONE] => UTC
    [REDIRECT_STATUS] => 200
    [COMPOSER_HOME] => /root
    [PHP_MEMORY_LIMIT] => 512M
    [PHP_MAX_EXECUTION_TIME] => 60
    [PHP_DISPLAY_ERRORS] => Off
    [PHP_COMPOSER_OPTIONS] =>
    [PHP_ALLOW_URL_FOPEN] => On
    [PHP_ZLIB_OUTPUT_COMPRESSION] => Off
    [PHP_DOCUMENT_ROOT] => /web/
    [PHP_DATE_TIMEZONE] => UTC
    [HTTP_HOST] => c.filtered.com
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.5
    [HTTP_ACCEPT_ENCODING] => gzip, deflate, br
    [HTTP_REFERER] => https://c.filtered.com/da/c/filtered
    [HTTP_COOKIE] => PHPSESSID=gcrn9sfbq1rhkactkau6s5fbn2; hl=da; returning_visitor=1; __utma=84468683.1790758543.1493197744.1493197744.1493207849.2; __utmc=84468683; __utmz=84468683.1493207849.2.2.utmcsr|utmccn=(
    referral
    )|utmcmd=referral|utmcct=/da/; PAPVisitorId=2491e88a40a6a8d0b2918dOIatw1xtp9; __utmb=84468683.1.10.1493207849; __utmt=1
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [CONTENT_TYPE] => application/x-www-form-urlencoded
    [HTTP_X_FORWARDED_PROTO] => https
    [HTTP_X_FORWARDED_FOR] => 172.31.25.85
    [HTTP_X_FORWARDED_HOST] => c.filtered.com
    [HTTP_X_FORWARDED_SERVER] => c.filtered.com
    [HTTP_CONNECTION] => Keep-Alive
    [CONTENT_LENGTH] => 253
    [PATH] => /usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
    [SERVER_SIGNATURE] =>
    [SERVER_SOFTWARE] => Apache
    [SERVER_NAME] => c.filtered.com
    [SERVER_ADDR] => 127.0.0.1
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 127.0.0.1
    [DOCUMENT_ROOT] => /var/www/html/web/
    [REQUEST_SCHEME] => http
    [CONTEXT_PREFIX] =>
    [CONTEXT_DOCUMENT_ROOT] => /var/www/html/web/
    [SERVER_ADMIN] => root@localhost
    [SCRIPT_FILENAME] => /var/www/html/web/app.php
    [REMOTE_PORT] => 54638
    [REDIRECT_URL] => /da/c/filtered
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => POST
    [QUERY_STRING] =>
    [REQUEST_URI] => /da/c/filtered
    [SCRIPT_NAME] => /app.php
    [PHP_SELF] => /app.php
    [REQUEST_TIME_FLOAT] => 1493208003.205
    [REQUEST_TIME] => 1493208003
)

【问题讨论】:

  • 站点注释:print_r() 插入换行符。您可能需要检查 HTML 源代码才能看到它们(在某些 Windows 浏览器中为 Ctrl+U)。
  • 这是通过记录器插入的
  • 您应该检查您的整个堆栈并找到 HTTP_X_FORWARDED_FOR 标头被删除的位置。可能是 ssl 终结者,可能是负载均衡器,可能是代理缓存...
  • 我想我找到了

标签: php symfony amazon


【解决方案1】:

您可以使用此功能获取真实IP,有时$_SERVER["REMOTE_ADDR"]不显示真实IP,因此需要自定义以获得真实IP。

function getRealIP()
    {
        if (isset($_SERVER["HTTP_CLIENT_IP"])) {
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        } elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_X_FORWARDED"])) {
            $ip = $_SERVER["HTTP_X_FORWARDED"];
        } elseif (isset($_SERVER["HTTP_FORWARDED_FOR"])) {
            $ip = $_SERVER["HTTP_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_FORWARDED"])) {
            $ip = $_SERVER["HTTP_FORWARDED"];
        } else {
            $ip = $_SERVER["REMOTE_ADDR"];
        }

        // Strip any secondary IP etc from the IP address
        if (strpos($ip, ',') > 0) {
            $ip = substr($ip, 0, strpos($ip, ','));
        }
        return $ip;
    }

【讨论】:

  • 这不是 OP 询问的内容
  • 没有真实IP,请查看
  • 如果 IP 在 $_SERVER 转储中不存在,则它不存在
  • 它会得到真实的ip并经过测试。
  • 不,不会,真正的 ip 不在 $_SERVER 转储中,它正在通过反向代理沿线某处被删除,请在回答垃圾之前理解问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 2013-03-23
相关资源
最近更新 更多