Node.js: получить IP-адрес клиента

24

req.connection.remoteAddress, req.headers ['x-forwarded-for'], req.ip, req.ips, что все это значит?

Есть ли прямой способ просто получить IP-адрес клиента/пользователя-агента, делающего запрос на мой сайт в Node.js/Express? Я не понимаю все прокси-материалы или все различия между всеми свойствами объекта req. Кроме того, я не понимаю, что такое "доверенный прокси" для Express.

Может кто-нибудь дать мне прямое объяснение тому, что разница между всеми этими свойствами, и ответить, как я могу просто получить IP-адрес клиента?

  • 0
    Как насчет использования node-ipware согласно объяснению здесь .
Теги:
express

5 ответов

43
Лучший ответ

req.ip - это простой способ получить IP-адрес клиента в Express. Вы можете увидеть используемую им логику (которая включает захват первого элемента из массива прокси-адресов req.ips, где этот массив построен из заголовков x-forwarded-for) здесь.

  • 0
    Не могли бы вы описать, что такое x-forwarded-for?
  • 1
    Каждый прокси перед вашим сервером добавляет заголовок x-forwarded-for. Много дополнительной информации здесь: en.wikipedia.org/wiki/X-Forwarded-For
16
// Get client IP address from request object ----------------------
getClientAddress = function (req) {
        return (req.headers['x-forwarded-for'] || '').split(',')[0] 
        || req.connection.remoteAddress;
};
  • 0
    И что держит req object, я имею в виду, что мы будем там предоставлять?
  • 2
    Обратите внимание, что req.headers['x-forwarded-for'] легко манипулируется на ПК, если вы не разместили свой сервер Node.JS за доверенным и правильно настроенным прокси-сервером. Вы должны сначала проверить req.connection.remoteAddress по списку известных доверенных прокси-серверов, прежде чем уважать req.headers['x-forwarded-for'] .
Показать ещё 2 комментария
1

очень просто

function getClientIP(req){
    return req.headers['x-forwarded-for'] || req.connection.remoteAddress;
}
  • 1
    Привет, я разместил app.enable('trust proxy'); в моем файле server.ts сразу после import { serverApi, createTodoApi } from './backend/api'; app.get('/data.json', serverApi); app.use('/api', createTodoApi()); следующего кода import { serverApi, createTodoApi } from './backend/api'; app.get('/data.json', serverApi); app.use('/api', createTodoApi()); и доступ к переменным req.ip в моем файле backend / api.ts. Где его возвращение ::ffff:127.0.0.1 , который не является действительным IP-адресом для извлечения местоположения из него. Ждем вашего ответа. Спасибо!
0

Как отмечали другие, из-за использования потенциального использования прокси, вы действительно должны использовать req.ip и НЕ использовать заголовок X-Forwarded-For, как это рекомендует многие люди. Пока вы правильно настроите прокси-сервер в качестве доверенного прокси, req.ip всегда будет возвращать IP-адрес конечного пользователя.

например. Если у вас был прокси-сервер, подключавшийся из 8.8.8.8, вы бы сделали:

var express = require('express');
var app = express();
app.set('trust proxy', '8.8.8.8');

Так как вы доверяете прокси-серверу, теперь это сделает так, что то, что передается в заголовке X-Forwarded-For, будет храниться в req.ip, но ТОЛЬКО, если оно происходит от одного из доверенных прокси.

Подробнее о доверенном прокси можно найти здесь.

Теперь, как отмечали другие в комментариях; особенно при разработке локально вы можете получить ip в формате ":: ffff: 127.0.0.1".

Чтобы всегда получать адрес IPv4, у меня есть:

getClientAddress = function (req) {
        return req.ip.split(":").pop();
};
-1

Получение IP-адреса клиента довольно просто:

 var ip = req.headers['x-forwarded-for'] || 
     req.connection.remoteAddress || 
     req.socket.remoteAddress ||
     req.connection.socket.remoteAddress;
     console.log(ip);
  • 1
    Обратите внимание, что req.headers['x-forwarded-for'] легко манипулируется на ПК, если вы не разместили свой сервер Node.JS за доверенным и правильно настроенным прокси-сервером. Вы должны сначала проверить req.connection.remoteAddress по списку известных доверенных прокси-серверов, прежде чем уважать req.headers['x-forwarded-for'] . Если задействовано несколько прокси, то req.headers['x-forwarded-for'] может содержать список через запятую.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню