0

我一直对返回公有IP地址的方法持怀疑态度。除非你使用诸如whatismyip.com之类的外部服务,否则它们似乎通常是有缺陷的。Rails的ActionPack remote_ip对于请求有多可靠?

如何可靠是Rails的remote_ip在确定的时间内外部公网ip 100%的方法?https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/middleware/remote_ip.rb

我刚刚发现我打的问题是CloudFlare,它有一个不同的标题可用CF-Connecting-IP。看来,我必须通过沿着(headers["CF-Connecting-IP"] || remote_ip)的方向来解决这个问题,以克服这种特殊情况。

这样看来,无论我需要猴补丁remote_ip或考虑到这一点,而不处处晾晒了我的代码。

+0

你打算怎么办?它应该可靠吗? – iltempo 2012-03-06 13:43:20

+0

只需使用webapp检测客户端的远程ip即可。目标是基于ip可靠地确定时区。 – ylluminate 2012-03-06 14:08:21

+0

你是不是在检测你自己的IP而不是远程那个服务? – iltempo 2012-03-06 14:11:28

回答

0

remote_ip来自HTTP请求头,所以任何人谁知道如何去改变它可以改变remote_ip地址。也可以用这种方式使用代理和更改地址。你可以使用它来进行地理定位或类似的东西,但我认为它不适合黑名单或白名单。

+0

最后不得不从相应的头提取IP:'CF连接-IP'和'X - 转发,For' – ylluminate 2012-03-20 19:21:43

2

我是当前实施remote_ip的作者,我不得不重做它以正确处理X-Forwarded-For(特别是如果请求包含多个X-Forwarded-For标头)。这听起来像你可能想提交一个拉请求,使该方法也检查CF-Connecting-IP标题。最后,您可能需要更改您在生产中使用的应用程序服务器,因为其中一些可以使用ignore repeated request headers

+0

我在相同的位置,海报,而我只是要求,看看它是否值得付出努力:是否有可能像这样的供应商特定的头文件的处理实际上被添加到rails源代码中? – rogerkk 2012-11-08 09:24:25

+0

编写自己的中间件来处理remote_ip并插入该中间件,而不是使用ActionPack附带的中间件是非常微不足道的。我建议你这样做,尝试一些事情,如果它对你有用,就提交一个拉取请求。 – indirect 2012-11-14 01:44:48