java 偽造http請求ip地址

碼魘發表於2019-01-19
最近做介面開發,需要跟第三方系統對接介面,基於第三方系統介面的保密性,需要將呼叫方的請求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就不生效了。

相關文章