如何在Node.js中使用WebSocket(websockets/ws)库获取客户端IP地址?

49
我在客户端对象上找不到客户端IP参数。

3
websocket._socket.remoteAddress - Grringo
3个回答

80

经过一番摸索,试图找出哪一个可以获取客户端(Web 浏览器)IP地址的方法,最终答案是:

ws._socket.remoteAddress

或者如果您可以通过 wss.on('connection', (ws, req) => {}) 访问 req

req.socket.remoteAddress

例如,您可以使用此功能来定位用户连接的地理位置。

编辑:

如果您正在Nginx反向代理(或任何其他反向代理)后面运行Node,则可能需要使用:

req.headers['x-forwarded-for'] || req.socket.remoteAddress

关于安全性的注意事项: 如果您的Node服务器可以直接访问,也可以通过反向代理进行访问,您可能需要在信任x-forwarded-for之前检查remoteAddress。 远程地址应该是您的反向代理的IP地址。 偶尔有人可能会直接调用您的服务并伪造x-forwarded-for


只是为了严谨起见 - 编辑适用于所有反向代理,而不仅仅是nginx(很多人使用haproxy) - UpTheCreek
1
这些网络套接字API的差异如此之大,令人震惊。潜力巨大,但却如此分散。 - Joey Carson
иҜ·жҹҘзңӢnpmдёӯзҡ„forwarded-forеә“пјҢе®ғеҸҜд»ҘиҮӘеҠЁдёәжӮЁеӨ„зҗҶеӨ§еӨҡж•°еҸҚеҗ‘д»ЈзҗҶе’ҢиҠӮзӮ№еҘ—жҺҘеӯ—дёҠзҡ„IPең°еқҖдҝЎжҒҜпјҢеӣ дёәиҝҷдәӣдҝЎжҒҜе·Із»ҸеҸ‘з”ҹдәҶеҫҲеӨҡеҸҳеҢ–гҖӮ - 3rdEden
感谢提醒,@OnurYıldırım。我已经更新了我的回答以反映这些变化。 - Chris Nolet
1
connection事件中,@fadedbee请求被作为第二个参数提供:server.on('connection', (ws, req) => { ..,请参阅https://github.com/websockets/ws/blob/master/doc/ws.md#event-connection。 - Will59
显示剩余3条评论

30

从打印套接字对象中获取到此内容的键:

> ws._socket.address()
  { port: 8081,
    family: 2,
    address: '127.0.0.1' }

> ws._socket.remoteAddress
  '74.125.224.194'

> ws._socket.remotePort
  41435

我没有任何文档,所以不确定这在各个版本中的支持情况如何 :/


6
在 WebSocket 服务器中,由于 req.connection 已经被弃用,您应该使用 req.socket
wss.on('connection', (ws, req) => {
    console.log(req.socket.remoteAddress);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接