【问题标题】:Is Node/Express redefining request.ip?Node/Express 是否在重新定义 request.ip?
【发布时间】:2015-10-13 21:53:26
【问题描述】:

我有一个合法的业务需要测试我们的服务器使用虚假 IP 地址的工作方式。我们在很多不同的地方使用request.ip,我不想用假IP地址替换“request.ip”的每个实例,所以我想我会在应用程序的入口点重新定义它(开始回调链)。但是,当request.ip 显然将自身改回“127.0.0.1”时,我遇到了一些意外行为!

这是我插入到“handle”方法中的(CoffeeScript)代码:

spanishIp ='37.35.128.128'
request.ip = spanishIp
console.log "ip: #{request.ip} / #{spanishIp}"

导致以下日志:

ip: 127.0.0.1 / 37.35.128.128

显然,request.ip 在将其设置为“37.35.128.128”和 console.log 语句之间被重新定义回我的实际 IP 地址 (127.0.0.1)。

当我将代码进一步移动到回调链中时,它按预期工作。

Node/Express 是否有可能在运行时有一些内部机制重复将request.ip 设置为用户的实际 IP 地址?

【问题讨论】:

  • 是的,我希望它为每个请求设置。在多主/多接口机器上,您可以为每个请求获取不同的 IP。

标签: node.js express


【解决方案1】:

express 中的 req.ip 属性始终通过函数调用从 req.ips 数组中提取,并且它是从 X-Forwarded-For 标头构建的。

Node.js: Get client's IP

https://github.com/strongloop/express/blob/master/lib/request.js#L285-L287

所以当你请求 req.ip 时,它总是会从 req.ips 数组中返回值。又名,您不能“设置” req.ip 属性。如果您需要手动执行任何操作,则需要使用请求正文,例如 req.body.ip。

【讨论】:

    【解决方案2】:

    试图通过摆弄 node / expressjs 的核心功能来欺骗 IP 地址听起来不是正确的方法。我建议您改为在您的应用程序中启用'trust proxy',然后使用X-Forwarded-* 标头来欺骗IP 地址。详情请见this。

    编辑:

    如果你真的想mock传入请求的IP地址,那么可能值得看一下this。同样,我不认为 node / expressjs 旨在允许出于任何目的修改 req.ip。

    【讨论】:

    • 这是很好的信息,但不能完全回答我的问题。我很好奇为什么我不能出于调试目的临时重新定义request.ip。
    猜你喜欢
    • 2013-05-02
    • 2019-02-19
    • 2018-03-28
    • 2019-09-13
    • 1970-01-01
    • 2016-12-04
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多