java web应用获取source ip问题

要点:

  • sourceip获取方式有几种,getRemoteAddr获取的是公网ip
  • apache+tomcat时,通过proxy-http模块+getRemoteAddr获取ip存在问题
  • 手机开启了移动数据且连接wifi时,本机ip取的是运营商分配的ip,而不是wifi路由器给的

应用获取客户端ip是一个常见的需求,像投票系统是比较典型的。ip是投票规则的重要组成部分。下面分两个部分来讨论这个话题。

source ip 能否伪造

http请求当中,ip理论上是无法伪造的。因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。但以下情况例外:

  • MITM攻击
  • 恶意程序控制了server的网络
  • 恶意程序伪造它所在网段的另一ip地址
  • BGP攻击
    通过以上描述,伪造源ip是一件比较困难的事情。

apache+tomcat 如何获取source ip

在java应用中,获取source ip一般通过request.getRemoteAddr()完成,这个一般没什么疑问,但有时,你会遇到问题。
以apache+tomcat部署场景为例。apache做反向代理,tomcat为backend server。经测试发现:

  • 若通过proxy-http模块连接,则取出的ip为apache的ip;
  • 若通过proxy-ajp模块连接,则取出的ip为实际的远程ip;
    当你获取source ip发现有问题时,需要考虑下web server与中间件是否通过http方式连接。

如果部署方式是基于http模块,又要获取source ip,此时应对web server做配置。参见 X-Forwarded-For

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容