Node.js/Express中使用req.ip获取用户IP地址是否为最佳实践?
Node.js/Express 获取用户IP方案说明
你当前使用的const ipAddress = String(req.ip || "unknown");不是通用的最优方案,确实存在IP被篡改的可能性,具体要看你的服务部署场景。
核心原理说明
- 如果你的Express服务直接对公网暴露,没有前置反向代理/CDN/负载均衡,那直接用
req.ip是安全的:这时候req.ip取的是TCP连接的远端IP,无法被用户篡改。 - 如果你的服务前面有反向代理层,默认配置下
req.ip拿到的是代理服务器的IP,不是用户真实IP;如果配置不当开启了信任代理,还可能拿到用户伪造的假IP。
正确实现方案
- 首先配置Express的
trust proxy参数,不要直接设为true,要填入你实际部署链路中信任的代理IP段,避免伪造风险:// 仅信任本机的反向代理(比如本地部署的Nginx) app.set('trust proxy', '127.0.0.1'); // 信任多个固定代理IP/IP段 app.set('trust proxy', ['127.0.0.1', '10.0.0.0/24', '你的CDN出口IP段']); - 配置完成后再使用
req.ip取值,这时候Express会自动过滤信任代理的IP,从X-Forwarded-For头中提取真实的用户IP,不会被用户自行篡改的请求头影响。 - 如果需要更可控的自定义逻辑,也可以根据你的代理层数手动提取:比如只有一层Nginx代理的情况下,可以手动取
X-Forwarded-For头的最后一段IP,对应真实用户的连接IP。
避坑提醒
绝对不要在没有配置信任代理的情况下,直接提取X-Forwarded-For、X-Real-IP这类请求头的第一个值,这类头用户可以任意修改,完全不可信。
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

