【发布时间】:2013-01-27 04:16:59
【问题描述】:
我在客户端对象上找不到客户端 IP 参数。
【问题讨论】:
-
websocket._socket.remoteAddress
我在客户端对象上找不到客户端 IP 参数。
【问题讨论】:
经过一番折腾,试图找出哪个提供了客户端(网络浏览器的)IP 地址,答案是:
ws._socket.remoteAddress
或者,如果您可以通过wss.on('connection', (ws, req) => {}) 访问req:
req.socket.remoteAddress
您可以使用它,例如,GeoIP 定位用户连接的位置。
编辑:
如果您在 Nginx 反向代理(或任何其他反向代理)后面运行 Node,您可能需要使用:
req.headers['x-forwarded-for'] || req.connection.remoteAddress
关于安全性的说明:如果您的 Node 服务器可以直接使用以及通过反向代理使用,您可能希望在信任x-forwarded-for 之前检查remoteAddress。远程地址应该是您的反向代理的 IP。有人可能会直接调用您的服务并欺骗 x-forwarded-for。
【讨论】:
forwarded-for 库,它会自动为您完成大部分反向代理和 Node 套接字上的 IP 地址信息,因为它已经更改了很多次。
upgradeReq 在 v3.0.0+ 中被移除
通过打印套接字对象中的键得到这个:
> ws._socket.address()
{ port: 8081,
family: 2,
address: '127.0.0.1' }
> ws._socket.remoteAddress
'74.125.224.194'
> ws._socket.remotePort
41435
我没有任何文档,所以我不确定跨版本的支持程度:/
【讨论】:
在 websocket 服务器中,由于 req.connection 已被弃用,您使用 req.socket。
wss.on('connection', (ws, req) => {
console.log(req.socket.remoteAddress);
});
【讨论】: