摘要:但是可以通过伪造数据包的来源,即在请求头加一个的头信息,这个头信息配置的是地址,它代表客户端,也就是的请求端真实的。因此在上面代码中加上如下代码服务端通过获取请求,并且校验安全性,代码如下总结通过请求头追加头信息可以伪造请求地址。
最近做接口开发,需要跟第三方系统对接接口,基于第三方系统接口的保密性,需要将调用方的请求IP加入到他们的白名单中。由于我们公司平常使用的公网的IP是不固定的,每次都需要将代码提交到固定的服务器上(服务器IP加入了第三方系统的白名单),频繁的修改提交合并代码和启动服务器造成了额外的工作量,给接口联调带来了很大的阻碍。正常的http请求
我们正常发起一个http的请求如下:
import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public static String getPost4Json(String url, String json) throws Exception { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); /* 设置超时 */ RequestConfig defaultRequestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000).setConnectionRequestTimeout(5000).build(); httpPost.setConfig(defaultRequestConfig); httpPost.addHeader("Content-Type", "application/json;charset=UTF-8"); httpPost.setEntity(new StringEntity(json, "UTF-8")); CloseableHttpResponse response = null; String result = null; try { response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); result = EntityUtils.toString(entity, "UTF-8"); } catch (Exception e) { throw e; } finally { if (response != null) response.close(); httpClient.close(); } return result; }
由于没有加入白名单的原因,这样的请求显然无法调用到第三方的接口。这时候考虑能否将请求的ip改为白名单的一个ip,服务器在解析时拿到的不是正常的ip,这样能否正常调用呢?
伪造http请求ip地址我们知道正常的tcp/ip在通信过程中是无法改变源ip的,也就是说电脑获取到的请求ip是不能改变的。但是可以通过伪造数据包的来源ip,即在http请求头加一个x-forwarded-for的头信息,这个头信息配置的是ip地址,它代表客户端,也就是HTTP的请求端真实的IP。因此在上面代码中加上如下代码:
httpPost.addHeader("x-forwarded-for",ip);
服务端通过x-forwarded-for获取请求ip,并且校验IP安全性,代码如下:
String ip = request.getHeader("x-forwarded-for");总结
通过请求头追加x-forwarded-for头信息可以伪造http请求ip地址。但是若服务器不直接信任并且不使用传递过来的 X-Forward-For 值的时候伪造IP就不生效了。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77304.html
摘要:在有反向代理的情况下,直接使用获取到的地址是所在服务器的地址,而不是客户端的。如何防范方法一在直接对外的反向代理服务器上配置如果有多层代理,内层的配置在最外层即直接对外提供服务的使用代替上面的,可以防止伪造。 问题背景 在Web应用开发中,经常会需要获取客户端IP地址。一个典型的例子就是投票系统,为了防止刷票,需要限制每个IP地址只能投票一次。 如何获取客户端IP 在Java中,获取客...
摘要:但是在通过了,等反向代理软件就不能获取到客户端的真实地址了。下面是一个参考获取客户端地址的方法如果使用的是连接池,可以参考使用方法,但这个是经过多级代理的地址,需要自己处理下获取第一个。 showImg(https://segmentfault.com/img/remote/1460000015379119); 在JSP里,获取客户端的IP地址的方法是:request.getRemot...
阅读 2014·2021-11-08 13:22
阅读 2482·2021-09-04 16:40
阅读 1129·2021-09-03 10:29
阅读 1652·2019-08-30 15:44
阅读 2095·2019-08-30 11:13
阅读 2765·2019-08-29 17:07
阅读 1935·2019-08-29 14:22
阅读 1224·2019-08-26 14:00