Node / Express是否重新定义request.ip?

时间:2015-10-13 21:53:26

标签: node.js express

我有合法的业务需求来测试我们的服务器使用虚假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被重新定义回我的实际IP地址(127.0.0.1),并将其设置为“37.35.128.128”和console.log语句。

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

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

2 个答案:

答案 0 :(得分:2)

试图通过摆弄node / expressjs的核心功能来欺骗ip地址听起来不像是正确的方法。我建议您在应用中启用'trust proxy',然后使用X-Forwarded-*标头欺骗IP地址。有关详细信息,请参阅this

修改

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

答案 1 :(得分:2)

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