我用 ChatGPT 问了一个获取客户端 IP 的代码,不太敢用,我得查一下:
public String getClientIP(HttpServletRequest request) {
String ip = request.getHeader("X-Real-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
//经过如负载均衡后的请求 header 会添加此请求头来标识源客户端的 IP 地址,如果不这样弄的话,那拿到负载均衡机器的 IP 地址并没有什么用的。
ip = request.getHeader("X-Forwarded-For");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
这是我发现的网站: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers ,但像代码中的大部分 Header 查不到,我就只查到一个 X-Forwarded-For
1
Kumo31 2023-05-06 21:48:51 +08:00
|
2
546L5LiK6ZOt 2023-05-06 21:50:16 +08:00
|
3
Kumo31 2023-05-06 21:53:01 +08:00
@Kumo31 刚刚没看清楚问题... 你的这些 Header 都是自定义的,不是标准的一部分,每个反向代理或 API 网关都有可能自己定义一个不同的 Header 用来表示真实 IP ,所以得看你的具体场景来判断...
|
4
v2eb 2023-05-06 21:54:37 +08:00
请求被 nginx 转发时, 可能会添加请求头 x-real-ip 这种, nginx 没配置的话就没有了
其他几个请求头同理 |
5
aru 2023-05-06 21:54:58 +08:00
不要随便相信 header 里面附带的 IP 变量!!!
很多网站的 ip 限制就是被这种方式给骗过去的。 |
6
mikewang 2023-05-06 22:01:28 +08:00
0. 目前来说,ChatGPT 生成的代码质量很低,不能直接用;
1. WL-Proxy-Client-IP 这类 header 是网关或者 CDN 自己定义的,需要查它们的文档,没有汇总; 2. 这种代码是有隐患的,客户端通过伪造这些 header ,可以欺骗你的程序。参考中科大测速被 XSS 的事件: /t/889220 |
7
yinmin 2023-05-06 23:01:46 +08:00 via iPhone
如果你是使用 nginx 前置部署的话,建议自定义一个 header 私有名称,避免被欺骗。
|
8
nnegier OP @546L5LiK6ZOt 那里面的内容和我文中的链接里的一样一样的
|
9
nnegier OP @ aru
@ mikewang @ yinmin 感谢提醒呀 |