java 偽造http請(qǐng)求ip地址的方法
最近做接口開(kāi)發(fā),需要跟第三方系統(tǒng)對(duì)接接口,基于第三方系統(tǒng)接口的保密性,需要將調(diào)用方的請(qǐng)求IP加入到他們的白名單中。由于我們公司平常使用的公網(wǎng)的IP是不固定的,每次都需要將代碼提交到固定的服務(wù)器上(服務(wù)器IP加入了第三方系統(tǒng)的白名單),頻繁的修改提交合并代碼和啟動(dòng)服務(wù)器造成了額外的工作量,給接口聯(lián)調(diào)帶來(lái)了很大的阻礙。
正常的http請(qǐng)求
我們正常發(fā)起一個(gè)http的請(qǐng)求如下:
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);
/* 設(shè)置超時(shí) */
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;
}
由于沒(méi)有加入白名單的原因,這樣的請(qǐng)求顯然無(wú)法調(diào)用到第三方的接口。這時(shí)候考慮能否將請(qǐng)求的ip改為白名單的一個(gè)ip,服務(wù)器在解析時(shí)拿到的不是正常的ip,這樣能否正常調(diào)用呢?
偽造http請(qǐng)求ip地址
我們知道正常的tcp/ip在通信過(guò)程中是無(wú)法改變?cè)磇p的,也就是說(shuō)電腦獲取到的請(qǐng)求ip是不能改變的。但是可以通過(guò)偽造數(shù)據(jù)包的來(lái)源ip,即在http請(qǐng)求頭加一個(gè)x-forwarded-for的頭信息,這個(gè)頭信息配置的是ip地址,它代表客戶端,也就是HTTP的請(qǐng)求端真實(shí)的IP。因此在上面代碼中加上如下代碼:
httpPost.addHeader("x-forwarded-for",ip);
服務(wù)端通過(guò)x-forwarded-for獲取請(qǐng)求ip,并且校驗(yàn)IP安全性,代碼如下:
String ip = request.getHeader("x-forwarded-for");
總結(jié)
通過(guò)請(qǐng)求頭追加x-forwarded-for頭信息可以偽造http請(qǐng)求ip地址。但是若服務(wù)器不直接信任并且不使用傳遞過(guò)來(lái)的 X-Forward-For 值的時(shí)候偽造IP就不生效了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)簡(jiǎn)單例子
這篇文章主要給大家介紹了關(guān)于java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)的相關(guān)資料,在開(kāi)發(fā)工作中我們有時(shí)需要去判斷List集合中是否含有重復(fù)的元素,需要的朋友可以參考下2023-10-10
Java多線程Thread基礎(chǔ)學(xué)習(xí)
每一個(gè)正在執(zhí)行的程序都是一個(gè)進(jìn)程,資源只有一塊,所以在同一時(shí)間段會(huì)有多個(gè)程序同時(shí)執(zhí)行,但是在一個(gè)時(shí)間點(diǎn)上,只能由一個(gè)程序執(zhí)行,多線程是在一個(gè)進(jìn)程的基礎(chǔ)之上的進(jìn)一步劃分,需要的朋友可以參考下2023-04-04
Mybatis-Plus的SQL語(yǔ)句組拼原理說(shuō)明
這篇文章主要介紹了Mybatis-Plus的SQL語(yǔ)句組拼原理說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
java開(kāi)發(fā)技巧代碼寫的快且bug少的原因分析
這篇文章主要為大家介紹了java開(kāi)發(fā)中代碼寫的快且bug少的原因分析及技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
JavaWeb實(shí)現(xiàn)簡(jiǎn)單用戶發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)簡(jiǎn)單用戶發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
eclipse實(shí)現(xiàn)ECDSA數(shù)字簽名
這篇文章主要為大家詳細(xì)介紹了eclipse實(shí)現(xiàn)ECDSA數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06

