博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
业务系统获取来源IP的正确姿势
阅读量:6258 次
发布时间:2019-06-22

本文共 1493 字,大约阅读时间需要 4 分钟。

hot3.png

@SuppressWarnings("unchecked") public static ClientIps getClientIpAddr(HttpServletRequest request) {    // 获取真实ip    String ip = request.getHeader("real-ip");    if (StringUtils.isBlank(ip) || ("unknown".equalsIgnoreCase(ip.trim()))) {        ip = request.getHeader("remote-host");    }    if (StringUtils.isBlank(ip) || ("unknown".equalsIgnoreCase(ip.trim()))) {        ip = request.getRemoteAddr();    }    ClientIps clientIps = new ClientIps();    clientIps.setTrueIp(StringUtils.trimToEmpty(ip));    // 获取代理ip    ip = request.getHeader("x-forwarded-for");    StringBuilder proxyIps = new StringBuilder();    if (StringUtils.isNotBlank(ip) && (StringUtils.contains(ip, ","))) {        String temp = StringUtils.substringBeforeLast(ip, ",");        if (StringUtils.isNotBlank(temp)) {            proxyIps.append("x-forwarded-for:");            proxyIps.append(temp);            proxyIps.append("\n");        }    }

获取真实的IP地址

业务系统获取来源IP的正确姿势

下面是一个简单的示意图,简单地把整个访问链路划分成可信区域和不可信区域。

可信区域,就是平台自己,或者友商建立的系统,可以保证从这些系统中获取并传递的数据是真实的、可信的。

获取来源IP的正确方式,是提取并记录本次请求首次进入可信区域时的remote address。不论这个IP是不是代理。

XFF伪造的情况其实非常普遍,也陆续地出现了一些替代方案,我司目前使用的,是设置一个专用的字段来传递这个IP,不会和XFF相覆盖。

此外,某些CDN服务商,会有自己定制化的Header字段,情况比较多,建议结合具体的情况来决定如何获取用户的来源IP。

比如,之前遇到一个客户,使用了阿里云的SLB负载均衡,SLB会给每一个请求都加上X-Forwarded-For字段,他们自己的反向代理又加一次。那么其实只要获取XFF中倒数第三个IP,作为来源IP即可。

一种参考方式如下:

在反向代理(Nginx)上配置,增加Real-IP字段:

location /{ ... proxy_set_header Real-IP $remote_addr; ...}

业务系统中,获取来源IP的代码如下(Java示例):

 

转载于:https://my.oschina.net/u/1399599/blog/1491275

你可能感兴趣的文章
可扩展性设计之Cache与Search的利用
查看>>
unity3d常见问题
查看>>
压缩UIImage
查看>>
hdu1509
查看>>
Eclipse+PyDev 安装和配置
查看>>
使用SQLServer Audit来监控触发器的启用、禁用情况(转载)
查看>>
OFBIZ Party Relationship 关系图
查看>>
获取Cookie(未测试)
查看>>
SQL Server 2008的备份和日志收缩
查看>>
注意linux bash缓存
查看>>
Html 常用事件列表
查看>>
UITextView 实现placeholder的方法
查看>>
Maven入门实战笔记-11节[1-5]
查看>>
python的多重继承
查看>>
索引 - 索引排序顺序
查看>>
MoSQL:简化MongoDB与PostgreSQL之间的同步[转]
查看>>
source insight中文显示和处理
查看>>
spring3.1, hibernate4.1 配置备份,struts2.2.1,sitemesh 2.4.2
查看>>
python字符串格式化输出的方式
查看>>
buffer busy waits等待事件
查看>>