Экспресс.js: как получить адрес удаленного клиента

Я не совсем понимаю, как я должен получить IP-адрес удаленного пользователя.

Допустим, у меня есть простой запрос, например:

app.get(/, function (req, res){
   var forwardedIpsStr = req.header('x-forwarded-for');
   var IP = '';

   if (forwardedIpsStr) {
      IP = forwardedIps = forwardedIpsStr.split(',')[0];  
   }
});

- Это выше подход правильный, чтобы получить реальный IP-адрес пользователя или есть лучший способ? А как насчет прокси?

9 ответов


Если вы работаете за прокси-сервером, таким как NGiNX или что у вас есть, только тогда вы должны проверить "X-forwarded-for":

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

если прокси не "ваш", я бы не доверял заголовку "X-forwarded-for", потому что его можно подделать.


в то время как ответ от @alessioalex работает, есть другой способ, как указано в Экспресс за прокси на Экспресс - гид.

  1. добавить app.enable('trust proxy') к вашему коду инициализации express.
  2. если вы хотите получить ip удаленного клиента, используйте req.ip или req.ips обычным способом (как будто нет обратного прокси)

дополнительные опции для "доверительного прокси" доступны, если вам нужно что - то еще сложнее, чем доверять всему, что прошло в заголовке x-forwarded-for, и ваш прокси-сервер не удаляет существующий заголовок x-forwarded-for из ненадежных источников. Дополнительные сведения см. в связанном руководстве.

Примечание: req.connection.remoteAddress не будет работать с моим решением.


на :
proxy_set_header X-Real-IP $remote_addr;

на node.js сервер файл:
var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;

обратите внимание, что express строчные заголовки


особенно для узла, документация для компонента сервера http, в разделе подключение к событию говорит:

[срабатывает] при установке нового потока TCP. [The] socket является объектом типа сеть.Разъем. Обычно пользователи не хотят получать доступ к этому событию. В в частности, сокет не будет выдавать читаемые события из-за того, как анализатор протокола подключается к сокету. Гнездо может также быть доступ на request.connection.

значит request.connection является сокетом, и в соответствии с документацией действительно есть гнездо.remoteAddress атрибут, который согласно документации является:

строковое представление удаленного IP-адреса. Например, '74.125.127.100' или '2001: 4860: a005:: 68'.

в разделе express объект запроса также является экземпляром объекта http-запроса узла, поэтому это подход все равно должен работать.

однако, под Express.Яш запрос уже имеет два атрибута: req.ip и req.ips

req.ip

верните удаленный адрес, или когда" доверительный прокси " включен-восходящий адрес.

req.ips

, когда "доверенный прокси" is true, проанализируйте список ip-адресов "X-Forwarded-For" и возвращает массив, в противном случае пустой массив возвращенный. Например, если значение было "client, proxy1, proxy2", вы получил бы массив ["клиент", "proxy1"," proxy2"], где " proxy2" дальше вниз по течению.

возможно, стоит упомянуть, что, согласно моему пониманию, Экспресс req.ip - это лучше, чем req.connection.remoteAddress С req.ip содержит фактический ip-адрес клиента (при условии, что доверенный прокси включен в express), тогда как другой может содержать IP-адрес прокси-сервера (если он есть).

вот почему принятый в настоящее время ответ предполагает:

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

на req.headers['x-forwarded-for'] будет эквивалентом express req.ip.


  1. добавить app.set('trust proxy', true)
  2. использовать req.ip или req.ips обычным способом

По данным Экспресс за прокси, req.ip принял во внимание обратный прокси, если вы настроили trust proxy правильно. Поэтому это лучше, чем req.connection.remoteAddress который получен из сетевого уровня и не знает прокси.


это работает для меня лучше, чем остальные. Мои сайты находятся за CloudFlare и, казалось, требуют cf-connecting-ip.

req.headers['cf-connecting-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress

не тест Экспресс за прокси как он ничего не сказал об этом cf-connecting-ip заголовок.


var ip = req.соединение.remoteAddress;

ip = ip.сплит(':')[3];


объект headers имеет все, что вам нужно, просто сделайте это:

var ip = req.заголовки ['X-forwarded-for'].сплит(',')[0];