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-IP
和 X-Forwarded-For
来伪造真实的源 IP。
解决方法:前面使用 Nginx 代理。
原理:Nginx 会从 TCP 链接中获取真正的 IP 信息,将其追加到X-Forwarded-For
最右侧,覆盖客户端伪造的X-Real-IP
。
1 | location / { |