
我用 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 May 6, 2023 |
2 546L5LiK6ZOt May 6, 2023 |
3 Kumo31 May 6, 2023 @Kumo31 刚刚没看清楚问题... 你的这些 Header 都是自定义的,不是标准的一部分,每个反向代理或 API 网关都有可能自己定义一个不同的 Header 用来表示真实 IP ,所以得看你的具体场景来判断... |
4 v2eb May 6, 2023 请求被 nginx 转发时, 可能会添加请求头 x-real-ip 这种, nginx 没配置的话就没有了 其他几个请求头同理 |
5 aru May 6, 2023 不要随便相信 header 里面附带的 IP 变量!!! 很多网站的 ip 限制就是被这种方式给骗过去的。 |
6 mikewang May 6, 2023 0. 目前来说,ChatGPT 生成的代码质量很低,不能直接用; 1. WL-Proxy-Client-IP 这类 header 是网关或者 CDN 自己定义的,需要查它们的文档,没有汇总; 2. 这种代码是有隐患的,客户端通过伪造这些 header ,可以欺骗你的程序。参考中科大测速被 XSS 的事件: /t/889220 |
7 yinmin May 6, 2023 via iPhone 如果你是使用 nginx 前置部署的话,建议自定义一个 header 私有名称,避免被欺骗。 |
8 nnegier OP @546L5LiK6ZOt 那里面的内容和我文中的链接里的一样一样的 |
9 nnegier OP @ aru @ mikewang @ yinmin 感谢提醒呀 |