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



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



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



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

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


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

994   9  

9 ответов:

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

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

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

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

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

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

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

на nginx.conf file:
proxy_set_header X-Real-IP $remote_addr;

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

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

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

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

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

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

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

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

req.ip

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

req.ips

, когда "доверенный прокси" и true, проанализируйте список ip-адресов" X-Forwarded-For " и возвращает массив, в противном случае пустой массив возвращенный. Например, если значение было "клиент, 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;

The 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];

объект заголовков имеет все необходимое, просто сделайте это:

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

Comments

    Ничего не найдено.