Экспресс.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 работает, есть еще один способ, как указано в Экспресс за прокси на Экспресс - гид.
- добавить
app.enable('trust proxy')в свой код инициализации.- если вы хотите получить ip удаленного клиента, используйте
req.ipилиreq.ipsобычным способом (как будто нет обратного прокси)Дополнительные параметры для 'доверенный прокси доступны, если вам нужно что-то более сложнее, чем доверять всему, что прошло в заголовке x-forwarded-for, и ваш прокси-сервер не удаляет существующий заголовок x-forwarded-for из ненадежных источников. Дополнительную информацию см. в связанном руководстве.
Примечание:
req.connection.remoteAddressне будет работать с моим решением.
на
nginx.conffile: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']будет эквивалентом expressreq.ip.
По данным Экспресс за прокси,
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.заголовки ['x-forwarded-for'].сплит(',')[0];
Comments