从request.connection.remoteAddress nodejs中剥离":: ffff:"前缀

coo*_*ool 22 node.js express

我正在使用nodejs(express)实现订阅/响应的可能性.当访问者发送请求时,除了请求中的其他参数(端口,时间间隔等...)之外,我将收集ip以便能够不时向该ip发送响应.

我正在使用以下内容获取访问者IP地址:

  var ip = req.headers['x-forwarded-for'] || 
             req.connection.remoteAddress || 
             req.socket.remoteAddress ||
             req.connection.socket.remoteAddress;
Run Code Online (Sandbox Code Playgroud)

基于如何使用Node.js获取用户的IP地址?

点是在我得到ip之后我有这样的东西:":: ffff:192.168.1.10"(在request.connection.remoteAddress解释现在在node.js中的:: ffff中加前缀)

我想知道,为了获得我能用来通过http响应来回复的ip地址,或者我在这里错过了其他的东西,只是为了取消":: ffff:"前缀"安全"吗?那不是我应该做的?

Mic*_*mim 24

是的,剥离是安全的.这是一个快速的方法.

address.replace(/^.*:/, '')
Run Code Online (Sandbox Code Playgroud)

会发生什么情况是您的操作系统正在侦听混合IPv4-IPv6套接字,该套接字将任何IPv4地址转换为IPv6,方法是将其嵌入到IPv4映射的IPv6地址格式中.此格式只是IPv4地址的前缀:ffff:,因此您只需剥离即可恢复原始IPv4地址:ffff:.(有些不推荐使用的映射前缀::代替:ffff:,因此我们使用正则表达式/^.*:/来匹配两种形式.)

如果您不确定传入的IPv6地址是否来自IPv4,则可以先检查它是否与IPv6映射模板匹配:

template = /^:(ffff)?:(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/
has_ipv4_version = template.test(address)
Run Code Online (Sandbox Code Playgroud)

  • 的确,我的问题是这是安全的事情.另外@Brad也有一点意义.经过我的研究(特别是针对我的情况),剥离已经足够了.我将这个答案标记为已接受的答案,记住所有内容都包括在内 - 确认,是否安全,如何剥离它以及如何检测它是否映射IPv4以避免问题. (3认同)
  • 这不是远程安全的.如果您有合法的IPv6地址怎么办? (2认同)

小智 16

如果要获取IPv4的IP地址,可以使用:

http.createServer(callback).listen(port, '0.0.0.0');
Run Code Online (Sandbox Code Playgroud)

那么,你会得到你想要的

req.connection.remoteAddress   // 192.168.1.10
Run Code Online (Sandbox Code Playgroud)

这是nodejs 的相关 文档

  • 我完全不同意。正如我上面提到的,获取地址的方式将涵盖所有情况,前面会有“::ffff:”。这就是问题的全部要点。我从来没有问过如何获取 IP,而是问我是否可以安全地去除添加到其中的前缀!更进一步,如果服务器在代理后面,上述解决方案将无法正确选择远程地址! (2认同)
  • `req.connection.remoteAddress` 为我提供了相同的 IP-6 扩展地址(来自 localhost),如已接受的答案中所述:`::ffff:127.0.0.1`。所以这个答案似乎不再正确。 (2认同)