我正在使用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响应回复,或者我在这里错过了其他的东西,这不是我应该做的?
答案 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));
答案 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)