如何获取客户在Heroku上的真实IP地址?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (43)

在Heroku Cedar上,我想获得客户的IP。第一次尝试:

ENV['REMOTE_ADDR']

这当然不起作用,因为所有的请求都是通过代理传递的。所以另一种方法是使用:

ENV['HTTP_X_FORWARDED_FOR']

但这不是很安全,是吗?

提问于
用户回答回答于

这意味着,如果你以正常方式访问Heroku应用程序,则只会在X-Forwarded-For标题中看到你的IP地址:

$ curl http://httpbin.org/ip
{
  "origin": "123.124.125.126",
}

所以在Heroku上获得客户端IP地址有一个明确而安全的解决方案:

$ curl -H"X-Forwarded-For: 8.8.8.8" http://httpbin.org/ip
{
  "origin": "8.8.8.8, 123.124.125.126"
}

顺便说一下这与维基百科上描述内容正好相反。

PHP实现:

function getIpAddress() {
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ipAddresses = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        return trim(end($ipAddresses));
    }
    else {
        return $_SERVER['REMOTE_ADDR'];
    }
}
用户回答回答于

假设某人发起了一个请求,并且任意添加了3个IP到X-Forwarded-For头部:

curl -H "X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4" http://www.google.com

试想一下,这台机器的IP是9.9.9.9,它必须通过代理。假设代理的IP为2.2.2.2。假设它没有被配置X-Forwarded-For去掉标题,它只会将9.9.9.9 IP添加到列表的末尾,并将请求传递给Google。在这一点上,标题看起来像这样:

X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4,9.9.9.9

然后,该请求将通过Google的端点传递,该端点将附加2.2.2.2的大学代理IP,因此标题最终将在Google日志中看起来如下所示:

X-Forwarded-For: 12.12.12.12,15.15.15.15,4.4.4.4,9.9.9.9,2.2.2.2

那么,哪个是客户端IP?从Google的角度来看,这是不可能的。实际上,客户端IP是9.9.9.9。列出的最后一个IP是2.2.2.2,第一个是12.12.12.12。所有Google都会知道,2.2.2.2 IP绝对是正确的,因为那是实际连接到他们服务的IP--但他们不知道这是否是来自可用数据的请求的最初客户端。同样,当这个头里只有一个IP时 - 这是直接连接到我们的服务的IP,所以我们知道它是可靠的。

扫码关注云+社区