HTTP Headers判断请求来源

X-Powered-By

X-开头的自定义字段。由语言解析器或者应用程序框架输出的,例如 PHP 的输出是:X-Powered-By: PHP/5.2.1

它可以告诉开发者后端使用的是什么框架/语言,所以有安全风险。对于自带此字段的框架/语言,需要手动去掉。

express 或者 nestjs中,可以使用:

1
app.disable('x-powered-by');

X-Forwarded-For

X-开头的自定义字段。用来识别通过代理或者负载均衡连接到服务端的真实 IP 地址路径。

例如对于 X-Forwarded-For: client1, proxy1, proxy2 来说,请求链路如下:

  • 从 client1 发出,抵达 proxy1
  • proxy1 将 client1 放入 X-Forwarded-For,请求转发到 proxy2
  • proxy2 将 proxy1 放入 X-Forwarded-For,请求转发到服务端
  • 服务端将 proxy2 放入 X-Forwarded-For,请求不再被转发,返回数据

可以看到,代理服务器每成功收到一个请求,就把请求来源 IP 地址添加到右边

X-Real-IP

X-开头的自定义字段,不属于任何任何标准。用来表示与 HTTP 代理产生 TCP 连接的设备 IP。

安全问题

攻击者可以通过手动构造 X-Real-IPX-Forwarded-For 来伪造真实的源 IP。

解决方法:前面使用 Nginx 代理。

原理:Nginx 会从 TCP 链接中获取真正的 IP 信息,将其追加到X-Forwarded-For最右侧,覆盖客户端伪造的X-Real-IP

1
2
3
4
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

参考链接