【问题标题】:Node.js: Get client's IPNode.js:获取客户端的 IP
【发布时间】:2013-10-16 11:24:46
【问题描述】:

req.connection.remoteAddress, req.headers['x-forwarded-for'], req.ip, req.ips,都是什么意思?

有没有一种直接的方法可以简单地获取在 Node.js/Express 中向我的站点发出请求的客户端/用户代理的 IP 地址?我不了解所有代理内容或 req 对象的所有属性之间的所有差异。另外,我不明白 Express 的“信任代理”选项是什么。

谁能给我一个直截了当的解释所有这些属性之间的区别,并回答我如何才能简单地获取客户的 IP?

【问题讨论】:

标签: javascript node.js express


【解决方案1】:

req.ip 是在 Express 中获取客户端 IP 地址的直接方法。您可以看到它使用的逻辑(包括从代理地址数组req.ips 中获取第一项,其中该数组是从x-forwarded-for 标头构造的)here

【讨论】:

【解决方案2】:
// Get client IP address from request object ----------------------
getClientAddress = function (req) {
        return (req.headers['x-forwarded-for'] || '').split(',')[0] 
        || req.connection.remoteAddress;
};

【讨论】:

  • req 对象包含什么,我的意思是我们应该在那里提供什么?
  • 请注意,req.headers['x-forwarded-for'] 很容易在 PC 上进行操作,除非您将 Node.JS 服务器放置在受信任且配置正确的代理服务器后面。在尊重req.headers['x-forwarded-for'] 之前,您应该首先检查req.connection.remoteAddress 与已知的可信任代理服务器列表。
  • 欣赏 OR 和拆分添加。如果您的应用同时位于负载均衡器和/或缓存层之后,这将非常有用。
  • 第一次点击返回::ffff:127.0.0.1,以后每次点击返回::1。两者都不是正确的公共 IP,并且无法从中获取位置。帮我解决这个问题。谢谢你!
  • 2021 年,对于没有 express 的 node.js,它仍然是答案!将其上传到主机以使其正常工作。谢谢!
【解决方案3】:

正如其他人所指出的,由于可能使用代理,您确实应该使用req.ip,而不是像很多人推荐的那样使用 X-Forwarded-For 标头。只要您将代理正确配置为可信代理,req.ip 将始终返回最终用户的 IP 地址。

例如如果你有一个从 8.8.8.8 连接的代理,你会这样做:

var express = require('express');
var app = express();
app.set('trust proxy', '8.8.8.8');

由于您信任代理,因此现在可以将 X-Forwarded-For 标头中传递的内容存储在 req.ip 中,但前提是它源自受信​​任的代理之一。

更多关于信任代理can be found here

现在,正如其他人在 cmets 中指出的那样;特别是在本地开发时,您可能会得到格式为“::ffff:127.0.0.1”的ip

始终获取我拥有的 IPv4 地址:

getClientAddress = function (req) {
    return req.ip.split(":").pop();
};

【讨论】:

    【解决方案4】:

    很简单

    function getClientIP(req){
        return req.headers['x-forwarded-for'] || req.connection.remoteAddress;
    }
    

    【讨论】:

    • 嗨,我已将 app.enable('trust proxy'); 放在我的 server.ts 文件中,紧跟在我的以下代码 import { serverApi, createTodoApi } from './backend/api'; app.get('/data.json', serverApi); app.use('/api', createTodoApi()); 之后,并在我的 backend/api.ts 文件中访问变量 req.ip。它返回::ffff:127.0.0.1,它不是从中获取位置的有效IP地址。等待您的答复。谢谢!
    【解决方案5】:

    获取客户端 IP 非常简单:

     var ip = req.headers['x-forwarded-for'] || 
         req.connection.remoteAddress || 
         req.socket.remoteAddress ||
         req.connection.socket.remoteAddress;
         console.log(ip);
    

    【讨论】:

    • 请注意,req.headers['x-forwarded-for'] 很容易在 PC 上进行操作,除非您将 Node.JS 服务器放在受信任且配置正确的代理服务器后面。在尊重req.headers['x-forwarded-for'] 之前,您应该首先根据已知的可信任代理服务器列表检查req.connection.remoteAddress。如果涉及多个代理,则req.headers['x-forwarded-for'] 可能包含一个逗号分隔的列表。
    猜你喜欢
    • 2019-12-17
    • 2015-12-31
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2014-10-06
    相关资源
    最近更新 更多