Web基础结构应该重置&x; x-forwarded - *"头?

时间:2017-10-07 11:30:08

标签: http nginx haproxy x-forwarded-for

给定一个Web基础结构,使用:

WEB - > HTTP PROXY - > NGINX - > PHP

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

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

作为开发人员,我无权访问haproxy / nginx配置,以及我们的infra。伙计们说这是开发人员的错误。

因此我的问题是,前端HTTP代理应该删除用户" X-forwarded"在将查询代理到app server之前的字段?

1 个答案:

答案 0 :(得分: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是您想要的地址。这是连接到堆栈的外部计算机的地址。

您可能希望在左侧进一步记录或以其他方式保留值,但在删除任何可信地址后,您无法根据除最右侧剩余地址之外的任何内容做出任何决策,因为这是唯一的你可以相信。

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