如何将客户端的正确 IP 地址获取到 Heroku 上托管的 Node socket.io 应用程序中?

Posted

技术标签:

【中文标题】如何将客户端的正确 IP 地址获取到 Heroku 上托管的 Node socket.io 应用程序中?【英文标题】:How to get the correct IP address of a client into a Node socket.io app hosted on Heroku? 【发布时间】:2013-01-01 04:58:25 【问题描述】:

我最近在 Heroku 上使用 Express 和 socket.io 托管了我的第一个 Node 应用程序,并且需要找到客户端的 IP 地址。到目前为止,我已经尝试过 socket.manager.handshaken[socket.id].addresssocket.handshake.addresssocket.connection.address,它们都没有给出正确的地址。

应用程序:http://nes-chat.herokuapp.com/(还包含指向 GitHub 存储库的链接)

查看已连接用户的 IP:http://nes-chat.herokuapp.com/users

谁知道问题出在哪里?

【问题讨论】:

相关:***.com/questions/6458083/… 【参考方案1】:

客户端 IP 地址在 X-Forwarded-For HTTP 标头中传递。我没有测试过,但是在确定客户端IP时是looks like socket.io already takes this into account。

你也应该可以自己拿,这里是guide:

function getClientIp(req) 
  var ipAddress;
  // Amazon EC2 / Heroku workaround to get real client IP
  var forwardedIpsStr = req.header('x-forwarded-for'); 
  if (forwardedIpsStr) 
    // 'x-forwarded-for' header may return multiple IP addresses in
    // the format: "client IP, proxy 1 IP, proxy 2 IP" so take the
    // the first one
    var forwardedIps = forwardedIpsStr.split(',');
    ipAddress = forwardedIps[0];
  
  if (!ipAddress) 
    // Ensure getting client IP address still works in
    // development environment
    ipAddress = req.connection.remoteAddress;
  
  return ipAddress;
;

【讨论】:

这里说明了为什么只取第一个可能很危险:esd.io/blog/flask-apps-heroku-real-ip-spoofing.html(该值可以被操纵。) 其中的拉取请求从未被 socket.io 接受。 谢谢!我正在使用 SocketIO v1.4.5,我必须将查找更改为 req.headers['x-forwarded-for'] 并检查 if (forwardedIpsStr && forwardedIpsStr !== undefined) 以使其正常工作。【参考方案2】:

你可以在一行中完成。

function getClientIp(req) 
    // The X-Forwarded-For request header helps you identify the IP address of a client when you use HTTP/HTTPS load balancer.
    // http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-for
    // If the value were "client, proxy1, proxy2" you would receive the array ["client", "proxy1", "proxy2"]
    // http://expressjs.com/4x/api.html#req.ips
    var ip = req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'].split(',')[0] : req.connection.remoteAddress;
    console.log('IP: ', ip);

我喜欢将它添加到中间件,并将 IP 作为我自己的自定义对象附加到请求中。

【讨论】:

当我在本地测试时,这总是会导致 IP:::1?【参考方案3】:

以下内容对我有用。

Var client = require('socket.io').listen(8080).sockets;

client.on('connection',function(socket) 
var clientIpAddress= socket.request.socket.remoteAddress;
);

【讨论】:

以上是关于如何将客户端的正确 IP 地址获取到 Heroku 上托管的 Node socket.io 应用程序中?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 3.1 - 如何获取客户端的 IP 地址?

Java正确获取客户端真实IP方法整理

如何从服务器获取我的 Corba 客户端的 IP 地址

为啥NodeJs获取客户端的IP都是这样的

为啥NodeJs获取客户端的IP都是这样的

php socket 获取客户端ip地址