最近在做一个消息推送企业某信的需求,使用的不是官方的api,而是和企业某信可以集成的云办公平台的api。由于api有ip白名单限制,导致我必须在特定化网络环境下发请求,测试很麻烦,所以想测试一下能不能绕过限制。 想要绕过限制,首先要知道服务器如何获取发送者的ip。

服务器如何获取请求者ip

获取请求者 IP 本质上就两个来源:

  • 直接从 IP 数据包获取 这就是 HttpServletRequest的getRemoteAddr() 的工作原理,获取的是直接与服务器建立 TCP 连接的客户端 IP,在没有代理的情况下,这就是真实的客户端 IP
  • 从 HTTP 请求头获取 常见的请求头有:
X-Forwarded-For
X-Real-IP
Proxy-Client-IP
WL-Proxy-Client-IP

测试

这里我使用了postman伪造了请求头X-Forwarded-For,经过测试,理论上只要知道正确的ip,就可以让ip白名单功能失效。

image-20250108103243598

如果你有服务器的访问权限,但是只知道服务器的内网ip,可以尝试

curl ifconfig.me

然后就能得到服务器的公网ip了

安全建议

  • 改用网络层的源IP地址(TCP/IP报文中的source IP)进行验证

  • 如果必须使用代理转发,建议只信任内部代理服务器传递的XFF头

吐槽

某云办公平台必须付费才能获得访问api的密钥,并且密钥只有一个,测试只能直接在正式系统测