Caddy服务器、X-Forwarded-For和伪造的值



使用Caddy服务器和reverse_proxy服务器,如下所示:

my.domain.com {
reverse_proxy * unix//path/to/socket
}

我可以很容易地访问我的请求头,在Python/Flask中执行以下操作:

request.headers.get('X-Forwarded-For')

它根据请求返回一个值列表。文档规定第一个值是我所依赖的客户端IP,但我最近发现这个值可能被欺骗,如下所示:

# Using Python requests
requests.get('https://my.domain.com', headers={'X-Forwarded-For': 'www.google.com'})

在这种情况下,标头值为:

X-Forwarded-For: www.google.com, xxx.xxx.xxx.xxx(xxx.xxx.xxx.xxx在这种情况下是我的有效IP(。

我的问题是:在排除任何欺骗的情况下,我如何确定地检索客户端的IP?

详细信息

我在Flask中测试了以下标题,使用我上面的Caddy配置,这些标题都设置为None:

Remote Addr: 0.0.0.0
X-Forwarded-For: www.google.com, xxx.xxx.xxx.xxx
Remote-Addr: None
Client-Ip: None
X-Forwarded: None
X-Cluster-Client-Ip: None
Forwarded-For: None
Forwarded: None

如维基百科所述,X-Forwarded-For的通用格式为:

X-Forwarded-For: client, proxy1, proxy2

其中,该值是一个以逗号+空格分隔的IP地址列表,最左边是原始客户端,传递请求的每个连续代理都添加了接收请求的IP地址。

在本例中,请求通过proxy1、proxy2,然后是caddy(未在标头中显示(caddy显示为请求的远程地址。

由于伪造X-Forwarded-For字段很容易,因此应谨慎使用给定的信息。最右边的IP地址始终是连接到最后一个代理的IP地址,这意味着它是最可靠的信息源。

简而言之:选择最后一个值!

最新更新