Снятие префикса ":: 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)