Снятие префикса ":: ffff:" от request.connection.remoteAddress nodejs
Я реализую функцию подписки/ответа с помощью nodejs (express). Когда клиент отправляет запрос, помимо других параметров в запросе (порт, временной интервал и т.д.), Я собираюсь собрать ip, чтобы время от времени отправлять ответ на этот ip.
Я получаю адрес ip-адреса посетителя, используя следующее:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
на основе Как получить IP-адрес пользователя с помощью Node.js?
Точка в том, что после получения ip у меня есть что-то вроде этого: ":: ffff: 192.168.1.10" (объяснено в request.connection.remoteAddress Now Prefixed in:: ffff in Node.js)
Я удивляюсь, разве это "безопасно", чтобы стричь префикс ":: ffff:", чтобы получить ip-адрес, который я смогу использовать для ответа через HTTP-ответ, или мне не хватает чего-то другого здесь, и это не то, что я должен делать?
Ответы
Ответ 1
Да, безопасно снимать. Вот быстрый способ сделать это.
address.replace(/^.*:/, '')
Случается, что ваша ОС прослушивает гибридный сокет 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)
Ответ 2
Если вы хотите получить IP-адрес IPv4, вы можете использовать:
http.createServer(callback).listen(port, '0.0.0.0');
тогда вы получите то, что хотите
req.connection.remoteAddress // 192.168.1.10
Вот соответствующий document nodejs
Ответ 3
app.post('/xyz',function(request,response)
{
var IPFromRequest=request.connection.remoteAddress;
var indexOfColon = IPFromRequest.lastIndexOf(':');
var IP = IPFromRequest.substring(indexOfColon+1,IPFromRequest.length);
console.log(IP);
});
Ответ 4
Этот код node...
возвращает 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
Ответ 5
Имел ту же проблему... im также новичок в javascript, но я решил это с помощью .slice
var ip = req.connection.remoteAddress;
if (ip.length < 15)
{
ip = ip;
}
else
{
var nyIP = ip.slice(7);
ip = nyIP;
}
Ответ 6
req.connection.remoteAddress.substring(7, req.connection.remoteAddress.length)