Node JS - 将IPv4与IPv6进行比较

时间:2016-10-26 21:38:37

标签: javascript node.js express ip sails.js

我使用快速JS(Sails JS)。

我的目标是只允许某些API使用某些IP地址。 "允许" IP以IPv4表示形式插入。

req.ip返回当前请求的IP,但IP代表IPv6。

有几个库处理从IPv4到IPv6的转换。其中一个是https://github.com/whitequark/ipaddr.js/

我进行比较的方法是将2个IP标准化并比较标准化字符串。显然,对于IPv4,我将其映射到IPv6然后将其标准化。

// allowedIPs is the array of allowed IPs
var isAllowed = _.some(allowedIPs, function(ip) {
    return IPService.areEqualIPs(ip, userIP);
});

IPService.js

var ipaddr = require('ipaddr.js');

exports.validateIP = function(ipStr) {
    return ipaddr.isValid(ipStr);
}

exports.getNormalizedIPv6String = function(ipStr) {
    if ( !ipaddr.isValid(ipStr) ) {
        var err = new Error('Invalid IP');
        throw err 
    }

    var ipObj = ipaddr.parse(ipStr);

    // Normalize IPv4 to IPv6 format
    if ( ipaddr.IPv4.isValid(ipStr) ) {
        return ipObj.toIPv4MappedAddress().toNormalizedString();
    }

    // Return normalized IPv6 format
    return ipObj.toNormalizedString();
}

exports.areEqualIPs = function(ip1, ip2) {
    return exports.getNormalizedIPv6String(ip1) === exports.getNormalizedIPv6String(ip2);
}

但是,对于大多数IP,归一化没有得到相同的结果

例如

ipaddr.parse("::1").toNormalizedString(); // 0:0:0:0:0:0:0:1
ipaddr.parse("127.0.0.1").toIPv4MappedAddress().toNormalizedString(); // 0:0:0:0:0:ffff:7f00:1

如何比较IPv4与IPv6?

0 个答案:

没有答案