【问题标题】:req.ip returning colon separated valuesreq.ip 返回冒号分隔值
【发布时间】:2021-01-05 23:39:12
【问题描述】:

期望的行为

在启用了 Cloudflare 并设置了 app.set('trust proxy', true) 的 Node/MongoDB/Azure 环境中,通过 req.ip 获取用户的 IP 地址。你可以看到the node docs on this setting here

实际行为

行为不一致,有时req.ip会返回想要的值,例如用点分隔的4个值:

123.456.789.10

有时它会返回这样的值,例如用冒号分隔的 8 个值:

2001:5005:1802:3500:18d2:k446:123b:g5h4

以上数值仅供参考

此外,我正在从两个位置捕获 IP,首先是从 req.ip 服务器端,其次是从 ajax 请求到 ipinfo.io 客户端。我使用req.ip 以防ipinfo.io 查找失败。

所以在某些情况下,ipinfo.io 将以预期格式返回一个值,而 req.ip 将以意外格式返回一个不同的值。我希望这些值保持一致/相同。

我的尝试/上下文

我在 node.js 服务器文件中使用app.set('trust proxy', true) 的原因是该站点启用了 Cloudflare,我需要获取用户的实际 IP 地址。我正在使用两个基于 IP 地址和时间应用限制的速率限制器包 - 例如 user1 可以每 5 分钟提交 3 个请求。因此,IP 地址需要是实际的请求者,而不是 cloudflare 代理。

使用的包有:

Express Rate Limit - 速率限制器逻辑
Rate Limit Mongo - 跟踪来自 MongoDB 中 IP 地址的请求的支持包

我在 Google 上搜索过 req.ip returning string with colons node.js 之类的内容,但结果似乎与 double colons 相关,而不是 single colons,例如:

Why is req.ip in node/Express returning colon separated IP addresses?

所以它们似乎不相关。

我还搜索了ip address formats 并发现了这个:

IPv4 and IPv6 address formats

这似乎表明我看到的是一个 IPv6 地址。

问题

为什么同一用户从ipinfo.io(浏览器)和req.ip(服务器)返回的值不同?

为什么req.ip 为某些用户返回IPv4 地址,而为其他用户返回IPv6 地址?

我是否应该或可以让req.ip 返回格式一致的值,最好是 IPv4 格式,因为它更易于阅读,然后我的速率限制器 mongodb 条目看起来一致?

【问题讨论】:

    标签: node.js mongodb express ip-address cloudflare


    【解决方案1】:

    ipv4 和 ipv6 都是“正确的”IP 地址。只是不同的人以不同的协议连接到您的服务。您可以选择只支持其中一个,但最好同时支持两者。

    如果您的应用程序同时支持这两种格式,它将更便于人们使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多