摘要:但是可以通過偽造數據包的來源,即在請求頭加一個的頭信息,這個頭信息配置的是地址,它代表客戶端,也就是的請求端真實的。因此在上面代碼中加上如下代碼服務端通過獲取請求,并且校驗安全性,代碼如下總結通過請求頭追加頭信息可以偽造請求地址。
最近做接口開發,需要跟第三方系統對接接口,基于第三方系統接口的保密性,需要將調用方的請求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就不生效了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77304.html
摘要:在有反向代理的情況下,直接使用獲取到的地址是所在服務器的地址,而不是客戶端的。如何防范方法一在直接對外的反向代理服務器上配置如果有多層代理,內層的配置在最外層即直接對外提供服務的使用代替上面的,可以防止偽造。 問題背景 在Web應用開發中,經常會需要獲取客戶端IP地址。一個典型的例子就是投票系統,為了防止刷票,需要限制每個IP地址只能投票一次。 如何獲取客戶端IP 在Java中,獲取客...
摘要:但是在通過了,等反向代理軟件就不能獲取到客戶端的真實地址了。下面是一個參考獲取客戶端地址的方法如果使用的是連接池,可以參考使用方法,但這個是經過多級代理的地址,需要自己處理下獲取第一個。 showImg(https://segmentfault.com/img/remote/1460000015379119); 在JSP里,獲取客戶端的IP地址的方法是:request.getRemot...
閱讀 2037·2021-11-08 13:22
閱讀 2500·2021-09-04 16:40
閱讀 1144·2021-09-03 10:29
閱讀 1709·2019-08-30 15:44
閱讀 2120·2019-08-30 11:13
閱讀 2785·2019-08-29 17:07
閱讀 1963·2019-08-29 14:22
閱讀 1244·2019-08-26 14:00