Não entendo completamente como devo obter um endereço IP de usuário remoto.
Digamos que eu tenha uma rota de solicitação simples, como:
app.get(/, function (req, res){
var forwardedIpsStr = req.header('x-forwarded-for');
var IP = '';
if (forwardedIpsStr) {
IP = forwardedIps = forwardedIpsStr.split(',')[0];
}
});
A abordagem acima está correta para obter o endereço IP real do usuário ou existe uma maneira melhor? E os proxies?
node.js
express
ip
ip-address
Erik
fonte
fonte
Respostas:
Se você estiver executando atrás de um proxy como o NGiNX ou o que você tem, somente então você deve procurar por 'x-forwarded-for':
Se o proxy não for 'seu', eu não confiaria no cabeçalho 'x-forwarded-for', porque ele pode ser falsificado.
fonte
proxy_set_header X-Forwarded-For $remote_addr;
na sua configuração nginx, caso esteja usando seu próprio proxy reverso.var ip = (req.headers['x-forwarded-for'] || req.connection.remoteAddress || '').split(',')[0].trim();
obter o IP do cliente.Enquanto a resposta do @alessioalex funciona, há outra maneira, conforme indicado na seção Express behind proxies do Express - guide .
app.set('trust proxy', true)
ao seu código de inicialização expressa.req.ip
oureq.ips
da maneira usual (como se não houvesse um proxy reverso)Leitura opcional:
req.ip
oureq.ips
.req.connection.remoteAddress
não funciona com esta solução.'trust proxy'
Estão disponíveis mais opções se você precisar de algo mais sofisticado do que confiar em tudo o que é passado nox-forwarded-for
cabeçalho (por exemplo, quando o seu proxy não remove o cabeçalho x-forwarded-for preexistente de fontes não confiáveis). Consulte o guia vinculado para mais detalhes.x-forwarded-for
cabeçalho, há duas possibilidades.proxy_set_header X-Forwarded-For $remote_addr;
à sua configuração.fonte
app.enable('trust proxy')
também funciona para usoreq.ip
. Exceto que eu recebo a porta com ela1.2.3.4:56789
. Para tirar isso, eu façovar ip = req.ip.split(':')[0]
No
nginx.conf
arquivo:proxy_set_header X-Real-IP $remote_addr;
No
node.js
arquivo do servidor:var ip = req.headers['x-real-ip'] || req.connection.remoteAddress;
note que expressam cabeçalhos em minúsculas
fonte
req.headers['x-real-ip']
até nonginx.conf
cabeçalho definido com letras maiúsculas.Especialmente para o nó, a documentação para o componente do servidor http, em conexão de evento, diz:
Então, isso significa
request.connection
é um soquete e, de acordo com a documentação, existe realmente um atributo socket.remoteAddress que, de acordo com a documentação, é:Sob express, o objeto de solicitação também é uma instância do objeto de solicitação http do Nó, portanto essa abordagem ainda deve funcionar.
No entanto, no Express.js, a solicitação já possui dois atributos: req.ip e req.ips
Vale ressaltar que, no meu entender, o Express
req.ip
é uma abordagem melhor do quereq.connection.remoteAddress
, uma vez quereq.ip
contém o IP do cliente real (desde que o proxy confiável seja ativado no express), enquanto o outro pode conter o endereço IP do proxy (se houver 1).Essa é a razão pela qual a resposta atualmente aceita sugere:
O
req.headers['x-forwarded-for']
será o equivalente a expressreq.ip
.fonte
app.set('trust proxy', true)
req.ip
oureq.ips
da maneira usualfonte
Esta é apenas uma informação adicional para esta resposta .
Se você estiver usando
nginx
, você adicionariaproxy_set_header X-Real-IP $remote_addr;
ao bloco de localização do site./etc/nginx/sites-available/www.example.com
por exemplo. Aqui está um exemplo de bloco de servidor.Após reiniciar
nginx
, você poderá acessar o ip em suas rotasnode
/express
aplicação comreq.headers['x-real-ip'] || req.connection.remoteAddress;
fonte
De acordo com o Express behind proxy ,
req.ip
considerou o proxy reverso se você configuroutrust proxy
corretamente. Portanto, é melhor doreq.connection.remoteAddress
que o obtido na camada de rede e desconhece o proxy.fonte
Eu escrevi um pacote para esse fim. Você pode usá-lo como middleware expresso. Meu pacote está publicado aqui: https://www.npmjs.com/package/express-ip
Você pode instalar o módulo usando
Uso
fonte
Sei que esta pergunta foi respondida, mas aqui está como consegui que a minha funcionasse.
fonte
Se você estiver bem usando a biblioteca de terceiros. Você pode verificar request-ip .
Você pode usá-lo é por
O código fonte é bastante longo, então não copio aqui. Você pode conferir em https://github.com/pbojinov/request-ip/blob/master/src/index.js
Basicamente,
Divulgue: Eu não estou associado à biblioteca.
fonte
Isso funcionou para mim melhor do que o resto. Meus sites estão por trás do CloudFlare e parecia exigir
cf-connecting-ip
.Não testou o Express atrás de proxies , pois não dizia nada sobre esse
cf-connecting-ip
cabeçalho.fonte
Com suporte a flare, nginx e x-real-ip
fonte
No meu caso, semelhante a esta solução, acabei usando a seguinte abordagem x-forwarded-for :
x-forwarded-for
O cabeçalho continuará adicionando a rota do IP desde a origem até o servidor de destino final; portanto, se você precisar recuperar o IP do cliente de origem, esse seria o primeiro item da matriz.fonte
var ip = req.connection.remoteAddress;
ip = ip.split (':') [3];
fonte
ip = ip.split(':').pop();
vai ser massa neste caso, se o ip normal ou seja, 127.0.0.1 virá. Ainda será capaz de lhe dar ip.O objeto cabeçalhos tem tudo o que você precisa, basta fazer o seguinte:
fonte
Juntando tudo a solução witk @kakopappa mais o
morgan
log do endereço IP do cliente:fonte