当前位置:  开发笔记 > 编程语言 > 正文

如何在节点中确定用户的IP地址

如何解决《如何在节点中确定用户的IP地址》经验,为你挑选了10个好方法。

如何从控制器中确定给定请求的IP地址?例如(快递):

app.post('/get/ip/address', function (req, res) {
    // need access to IP address here
})

topek.. 418

在您的request对象中有一个名为的属性connection,它是一个net.Socket对象.net.Socket对象有一个属性remoteAddress,因此您应该能够通过此调用获取IP:

request.connection.remoteAddress

请参阅http和net的文档

编辑

正如@juand在评论中指出的那样,如果服务器位于代理之后,获取远程IP的正确方法是 request.headers['x-forwarded-for']



1> topek..:

在您的request对象中有一个名为的属性connection,它是一个net.Socket对象.net.Socket对象有一个属性remoteAddress,因此您应该能够通过此调用获取IP:

request.connection.remoteAddress

请参阅http和net的文档

编辑

正如@juand在评论中指出的那样,如果服务器位于代理之后,获取远程IP的正确方法是 request.headers['x-forwarded-for']


它是request.headers ['X-Forwarded-For']
返回"NULL"
这给了我一个不同于whatismyip.com给我的IP地址.那为什么会这样?
请注意,net.Stream现在是net.Socket,文档位于此处:http://nodejs.org/api/net.html#net_class_net_socket
我在http://no.de实例上安装了我的API服务.当我尝试从我的计算机访问它时,我得到一个"10.2.XXX.YYY"的IP地址,而我的真实世界IP是"67.250.AAA.BBB"
对于任何有兴趣的人,对于Heroku来说:`request.headers ['x-forwarded-for']`

2> Edmar Miyake..:
var ip = req.headers['x-forwarded-for'] || 
     req.connection.remoteAddress || 
     req.socket.remoteAddress ||
     (req.connection.socket ? req.connection.socket.remoteAddress : null);

请注意,有时您可以获得多个IP地址req.headers['x-forwarded-for'].此外,x-forwarded-for不会始终设置标头,这可能会引发错误.

该领域的一般格式是:

的x转发换: client, proxy1, proxy2, proxy3

其中值是逗号+空格分隔的IP地址列表,最左边是原始客户端,每个连续的代理通过请求添加接收请求的IP地址.在此示例中,请求通过proxy1,proxy2然后传递proxy3.proxy3显示为请求的远程地址.

这是Arnav Gupta建议的解决方案,马丁在下面的评论中为x-forwarded-for未设置的案例提出了修正:

var ip = (req.headers['x-forwarded-for'] || '').split(',').pop() || 
         req.connection.remoteAddress || 
         req.socket.remoteAddress || 
         req.connection.socket.remoteAddress


最后一行req.connection.socket.remoteAddress抛出错误.小心点.
返回的ip地址是:: 1.为什么?
这通常很好但但由于某种原因我最近得到错误"无法读取属性'remoteAddress'的undefined"因为显然一切都是null/undefined,包括`req.connection.socket`.我不确定为什么/什么条件会导致这种情况但最好检查`req.connection.socket`是否存在以避免服务器在发生这种情况时崩溃.
如何防止这些标题的欺骗?
@ZhouHao它是你的IPv6格式的ip地址
如果您在设置这些标头的代理后面,它将添加到地址列表的末尾。最后一个将由您的代理设置,前一个可能来自以前的负载均衡器或来自客户端的“欺骗”。我想您也可以告诉LB覆盖标头。
请注意:regexp仅适用于IPv4,不应在生产中使用。
@bagusflyer这是您的localhost IP地址
查看pop()的工作方式,似乎您将要获得最后一个代理,而不是您想要的客户端。我错了吗?
问题:当`x-forwarded-for`返回`undefined`时发生错误.修复:添加`|| 在阅读标题后"`` 最后:`var ip =(req.headers ['x-forwarded-for'] ||'').split(',').pop()...`
没有人惊讶地提到这一点。您需要修剪数组结果,以防x-forwarded-for返回多个ip。否则,您将获得一个无效的IP地址,并带有前导空格。像`req.headers ['x-forwarded-for'] ||一样 '').split(',')。pop()。trim();`或用逗号和空格`split(,)`进行拆分

3> Jason Sebrin..:
如果使用快递...

req.ip

我正在看这个,然后我就像等待,我正在使用快递.咄.



4> un33k..:

您可以保持DRY并且只使用支持IPv4IPv6的node-ipware.

安装:

npm install ipware

在您的app.js或中间件中:

var getIP = require('ipware')().get_ip;
app.use(function(req, res, next) {
    var ipInfo = getIP(req);
    console.log(ipInfo);
    // { clientIp: '127.0.0.1', clientIpRoutable: false }
    next();
});

它将尽最大努力获取用户的IP地址或返回127.0.0.1以指示它无法确定用户的IP地址.查看README文件以获取高级选项.


"或返回127.0.0.1表示无法确定用户的IP地址"127.0.0.1和未知之间存在很大差异......
当从Heroku测试时,它为我返回了一些奇怪的东西`:ffff :(不是我的IP地址)` @ edmar-miyake的回答对我来说很合适.
那个方法为我返回`clientIp:':: 1'`.它似乎不起作用.

5> pbojinov..:

您可以使用request-ip来检索用户的IP地址.它处理了相当多的不同边缘情况,其中一些在其他答案中提到.

披露:我创建了这个模块

安装:

npm install request-ip

在您的应用中:

var requestIp = require('request-ip');

// inside middleware handler
var ipMiddleware = function(req, res, next) {
    var clientIp = requestIp.getClientIp(req); // on localhost > 127.0.0.1
    next();
};

希望这可以帮助



6> Ben Davies..:

request.headers['x-forwarded-for'] || request.connection.remoteAddress

如果x-forwarded-for标题在那里然后使用它,否则使用该.remoteAddress属性.

The x-forwarded-for header is added to requests that pass through load balancers (or other types of proxy) set up for HTTP or HTTPS (it's also possible to add this header to requests when balancing at a TCP level using proxy protocol). This is because the request.connection.remoteAddress property will contain the private ip address of the load balancer rather than the public ip address of the client. By using an OR statement, in the order above, you check for the existence of an x-forwarded-for header and use it if it exists otherwise use the request.connection.remoteAddress.



7> ashishyadave..:

以下函数已涵盖所有案例将有所帮助

var ip;
if (req.headers['x-forwarded-for']) {
    ip = req.headers['x-forwarded-for'].split(",")[0];
} else if (req.connection && req.connection.remoteAddress) {
    ip = req.connection.remoteAddress;
} else {
    ip = req.ip;
}console.log("client IP is *********************" + ip);



8> 小智..:

function getCallerIP(request) {
    var ip = request.headers['x-forwarded-for'] ||
        request.connection.remoteAddress ||
        request.socket.remoteAddress ||
        request.connection.socket.remoteAddress;
    ip = ip.split(',')[0];
    ip = ip.split(':').slice(-1); //in case the ip returned in a format: "::ffff:146.xxx.xxx.xxx"
    return ip;
}


9> 小智..:

获取IP地址有两种方法:

    let ip = req.ip

    let ip = req.connection.remoteAddress;

但是上述方法存在问题.

如果您在Nginx或任何代理后面运行您的应用程序,则每个IP地址都将是127.0.0.1.

因此,获取用户IP地址的最佳解决方案是: -

let ip = req.header('x-forwarded-for') || req.connection.remoteAddress;



10> Michael Lang..:

如果您使用的是快速版本3.x或更高版本,则可以使用信任代理设置(http://expressjs.com/api.html#trust.proxy.options.table),它将遍历地址链x-forwarded-for标头并将最新的ip放入您未配置为可信代理的链中,放入req对象的ip属性中.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有