0

给定一个网络基础设施,具有:

WEB --> HTTP 代理 --> NGINX --> PHP

我们使用 Php 中的 "X-forwarded-{for,host} 来获取真实的 IP 和主机。但有时,我们得到了错误的值,我发现可以像这样设置这些字段:

curl -sL http://www.toto.com -H "X-Forwarded-For: 1.96.0.1"

作为开发人员,我无权访问 haproxy/nginx 配置和我们的基础设施。伙计们说这是开发商的错。

因此我的问题是,前端 HTTP 代理应该在将查询代理到应用服务器之前删除用户“X-forwarded”字段吗?

4

1 回答 1

0

错误是假设最左边的值X-Forwarded-For是客户端地址。这不是它的预期工作方式。

X-Forwarded-For通过将来自传入连接的地址附加到传入标头值的右侧(如果存在)来工作。

正确的解决方案是应用程序从右侧开始读取,在向左移动时消除可信地址,然后停止。

最右边的不受信任地址是您要查找的地址。

X-Forwarded-For: 192.168.1.5, 203.0.113.5, 10.0.0.5

假设 10.0.0.5 是代理。Nginx 添加了这个地址,因为连接来自代理。您知道此地址并相信它始终会附加它所看到的客户地址,因此您将其从列表中删除。它不是浏览器。您知道,凭借您对这台机器的信任,左边的下一个地址是真实且正确的,并且是由代理添加的。

删除 10.0.0.5 后,您会发现 203.0.113.5 现在是最右边的地址。因为您刚刚删除了一个受信任的地址,所以您知道 203.0.113.5 是正确的,但您不认识,因此无法信任该地址左侧的任何进一步信息。如果 203.0.113.5 是 Web 代理,属于外部组织,那么左边的下一个地址 192.168.1.5可能是该设备后面的浏览器地址,也可能是伪造的。最终,没关系,因为最右边的不受信任的地址,203.0.113.5 就是你想要的地址。这是连接到您的堆栈的外部机器的地址。

您可能希望记录或以其他方式保留更左侧的值,但在删除任何受信任的地址后,除了最右边的剩余地址之外,您无法做出任何决定,因为这是您唯一可以相信的地址。

重要的是,您必须在最右边的不受信任的设备地址处停止进一步处理,因为如果受信任的地址出现在该点的左侧,那么它就是伪造的。

于 2017-10-07T20:38:49.680 回答