剥离" :: ffff:" request.connection.remoteAddress nodejs

时间:2015-06-28 14:06:57

标签: 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;

基于How can I get the user's IP address using Node.js?

重点是,在我得到ip后,我有类似的东西:" :: ffff:192.168.1.10" (在request.connection.remoteAddress Now Prefixed in ::ffff in node.js解释)

我想知道,它是否安全"剥离" :: ffff:"前缀是为了获得我能够使用的IP地址,以便通过http响应回复,或者我在这里错过了其他的东西,这不是我应该做的?

8 个答案:

答案 0 :(得分:20)

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

address.replace(/^.*:/, '')

您的操作系统正在使用混合IPv4-IPv6套接字进行侦听,该套接字将任何IPv4地址转换为IPv6,方法是将其嵌入IPv4-mapped IPv6 address format。此格式仅使用:ffff:作为IPv4地址的前缀,因此您只需剥离:ffff:即可恢复原始IPv4地址。 (有些已弃用的映射前缀为::而不是:ffff:,因此我们使用正则表达式/^.*:/来匹配两种表单。)

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

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

答案 1 :(得分:15)

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

http.createServer(callback).listen(port, '0.0.0.0');

然后,你会得到你想要的东西

req.connection.remoteAddress   // 192.168.1.10

以下是nodejs的相关document

答案 2 :(得分:1)

-Dcom.sun.javafx.isEmbedded=true

答案 3 :(得分:1)

此节点代码......

如果ipv6地址确实是映射的ipv4地址,则将ipv6返回给ipv4 否则它返回一个标准化的ipv6地址 否则它只返回它最初的ip字符串

var ip = (function (req) {
    var ipaddr = require('ipaddr.js');
    var ipString = (req.headers["X-Forwarded-For"] ||
        req.headers["x-forwarded-for"] ||
        '').split(',')[0] ||
        req.connection.remoteAddress;

    if (ipaddr.isValid(ipString)) {
        try {
            var addr = ipaddr.parse(ipString);
            if (ipaddr.IPv6.isValid(ipString) && addr.isIPv4MappedAddress()) {
                return addr.toIPv4Address().toString();
            }
            return addr.toNormalizedString();
        } catch (e) {
            return ipString;
        }
    }
    return 'unknown';
}(req));

https://www.npmjs.com/package/ipaddr.js

https://github.com/whitequark/ipaddr.js

答案 4 :(得分:0)

我用::ffff:192.168.1.10分隔符分割remoteAddress :,然后简单地将输出数组的值放在索引array.length - 1

像这样:

const remoteAddress = '::ffff:192.168.0.3'
const array = remoteAddress.split(':')
const remoteIP = array[array.length - 1]
console.log(remoteIP)

打印出192.168.0.3

答案 5 :(得分:0)

只需添加迈克尔·马修·托米姆(Michael Matthew Toomim)提供的答案,

如果要测试以查看IP 是否是映射为IPv6的IPv4地址,则可能需要将正则表达式调整为:

/^:{1,2}(ffff)?:(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/

区别是/^:{1,2}而不是/^:,这允许两个地址都以::ffff::ffff:开头。

答案 6 :(得分:-2)

有同样的问题...我也是javascript的新手,但我用.slice解决了这个问题

var ip = req.connection.remoteAddress;

if (ip.length < 15) 
{   
    ip = ip;
}
else
{
    var nyIP = ip.slice(7);
    ip = nyIP;
}

答案 7 :(得分:-3)

req.connection.remoteAddress.substring(7,req.connection.remoteAddress.length)