Экспресс.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')
к вашему коду инициализации express. - если вы хотите получить 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
.
По данным Экспресс за прокси, 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
заголовок.
объект headers имеет все, что вам нужно, просто сделайте это:
var ip = req.заголовки ['X-forwarded-for'].сплит(',')[0];