我使用快速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?