http – 在Heroku上获取客户端的真实IP地址

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

ENV['REMOTE_ADDR']

这当然不行,因为所有的请求都是通过代理进行的。所以替代方法是使用:

ENV['HTTP_X_FORWARDED_FOR']

但这不是很安全吗?

如果它只包含一个值,我拿这个。如果它包含多个值(以逗号分隔),我可以拿第一个。

但是如果有人操纵这个价值呢?我不能像ENV [‘REMOTE_ADDR’]那样相信ENV [‘HTTP_X_FORWARDED_FOR’]。而且还没有可以使用的可信代理列表。

但一定要有一定的方法可靠地获取客户端的IP地址。你知道吗

their docs年,Heroku介绍说,X-Forwarded-For是“连接到Heroku路由器的客户端的始发IP地址”。

这听起来好像Heroku可以用始发的远程IP覆盖X-Forwarded-For。这样可以防止欺骗,对吧?有人可以验证吗?

最佳答案
当时,Heroku的安全总监雅各布:

The router doesn’t overwrite X-Forwarded-For, but it does guarantee that the real origin will always be the last item in the list.

这意味着,如果您以正常方式访问Heroku应用程序,您将只在X-Forwareded-For标头中看到您的IP地址:

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

如果您尝试欺骗知识产权,您的所谓起源就会被反映出来,但至关重要的是,您的真实IP也是如此。显然,这是我们需要的,所以有一个明确和安全的解决方案来获取客户端的IP地址在Heroku:

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

这正好与what is described on Wikipedia相反,顺便说一句。

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'];
    }
}

转载注明原文:http – 在Heroku上获取客户端的真实IP地址 - 代码日志