Node.js:获取客户端IP

35

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

在Node.js/Express中,有没有一种简单直接的方法来获取向我的站点发出请求的客户端/用户代理的IP地址?我不理解所有代理的内容或req对象的所有属性之间的区别。此外,我不了解Express中'trust proxy'选项的含义。

有人能够简单明了地解释这些属性之间的区别,并回答如何简单获取客户端的IP地址吗?


可以按照这里的解释使用 **node-ipware**。 - Avid Coder
5个回答

62

req.ip 是在 Express 中获取客户端 IP 地址的简单方法。您可以查看它使用的逻辑(其中涉及从代理地址数组 req.ips 中获取第一个项目,该数组是从 x-forwarded-for 头部构建的)这里


你能描述一下x-forwarded-for是什么吗? - Sam
1
您的服务器前面的每个代理都会添加x-forwarded-for头信息。更多信息请参见:http://en.wikipedia.org/wiki/X-Forwarded-For - Dan Kohn

21
// Get client IP address from request object ----------------------
getClientAddress = function (req) {
        return (req.headers['x-forwarded-for'] || '').split(',')[0] 
        || req.connection.remoteAddress;
};

req对象保存了什么内容,我的意思是我们应该在那里提供什么? - Sanjay
3
请注意,除非您将Node.JS服务器放置在可信且正确配置的代理服务器后面,否则PC上的req.headers['x-forwarded-for']很容易被篡改。在尊重req.headers['x-forwarded-for']之前,您应该首先将req.connection.remoteAddress与已知的可信代理服务器列表进行比较。 - 700 Software
感谢OR和split的添加。如果您的应用程序在负载均衡器和/或缓存层后面,则这很有用。 - justinpage
5
首次访问返回 ::ffff:127.0.0.1,后续每次访问都返回 ::1。这两个地址均不是公共 IP 地址,无法获取其位置信息。请帮我解决此问题。谢谢! - Dynamic Remo
对于2021年,如果没有使用Express,Node.js仍然是最好的选择!将其上传到托管平台以确保其正常运行。 - Mr.Fingers

5

正如其他人所指出的,由于可能使用代理的原因,您真的应该使用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 中,但仅当它来自受信任的代理之一时才会存储。

有关信任代理的更多信息请点击此处

现在,正如其他人在评论中指出的那样,特别是在本地开发时,你可能会得到格式为“::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;
}

1
嗨,我在我的server.ts文件中紧跟着以下代码import { serverApi, createTodoApi } from './backend/api'; app.get('/data.json', serverApi); app.use('/api', createTodoApi());后放置了app.enable('trust proxy');,并在我的backend/api.ts文件中访问变量req.ip。它返回的是::ffff:127.0.0.1,这不是一个有效的IP地址,无法从中获取位置信息。等待您的回复。谢谢! - Dynamic Remo
当我在本地测试时,我最初也遇到了 ffff。虽然它很容易解析,但我选择根据 这个答案 将服务器设置为仅监听 IPv4(反正我有代理),这样就可以在 remoteAddress 上得到一个干净的 IPv4。 - Nagev

0

获取客户端IP非常简单:

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

1
请注意,除非你已经将Node.JS服务器放在可信和正确配置的代理服务器后面,否则 req.headers['x-forwarded-for'] 很容易被 PC 操纵。在接受 req.headers['x-forwarded-for'] 之前,你应首先将 req.connection.remoteAddress 与已知的可信代理服务器列表进行比对。如果有多个代理涉及,则 req.headers['x-forwarded-for'] 可能包含一个逗号分隔的列表。 - 700 Software

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