从Java中的特定IP生成HttpRequest

Red*_*ddy 3 java http ip-address spoofing apache-httpclient-4.x

我正在使用Apache HttpClient生成Post请求并提交数据.由于远程应用程序在提交数据的用户的IP地址上进行中继,因此我想发送用户指定IP地址的发布请求.

我该如何配置?

public static void loginUser(String username, String password, String ip) throws Exception{
      try {
            HttpClient client = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://login.myapp.com/");

            // Request parameters and other properties.
            List<NameValuePair> params = new ArrayList<NameValuePair>(2);
            params.add(new BasicNameValuePair("username",username));
            params.add(new BasicNameValuePair("password", password));
            httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

            // Execute and get the response.
            HttpResponse response = client.execute(httppost);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                //etc....
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:为避免混淆,

我想在httprequest标头中包含自定义IP地址,以便最终应用程序知道,[来自我的应用程序]的此请求来自自定义IP地址,但不是来自我的应用程序运行的IP地址

假设我的应用程序在服务器上运行,IP地址为"1.1.1.0".现在我的用户正在使用"test","test","199.199.199.0"执行loginUser方法.现在,从应用程序到目标URL的HTTP请求应该是从"199.199.199.0"发送的

Jas*_*n C 7

OP写道:

我想在httprequest标头中包含自定义IP地址,以便最终应用程序知道[来自我的应用程序]此请求来自自定义IP地址,但不是来自运行我的应用程序的IP地址
...
让我说我打开了google.co .in,现在谷歌服务器知道这个请求来自我的IP地址.现在,如果我在apache中使用HttpClient,我如何配置该IP地址,以便当谷歌服务器读取时,它将处理此请求最初来自该IP地址

你不能.

(这实际上是我在下面的原始答案中写的第4种解释.)

发件人的IP地址不会作为HTTP标头发送.它是在IP协议头中的字段中发送的.服务器在套接字级别获取发送者的IP地址低,但不从HTTP信息获取它.

不,你不能伪造你的IP(它被称为"欺骗"),即使你想.Java没有对原始套接字的本机支持,您无法在IP级别修改信息.即使您可以(或者您使用JNI或某些出站数据包过滤应用程序或硬件),TCP的性质使IP欺骗对您的情况无效(响应将被发送到虚假IP,以及许多其他困难,远远超出这个答案的范围).

所以,不,你不能做你想做的事.您需要为要连接的服务器的管理员制定特殊规则,或者需要认真重新考虑应用程序的设计.

编辑:其他替代品

我在这个问题的评论中提到了这些,但我在答案中也包括它们以及完整性:

根据您的安全要求,一种可能的解决方案是为用户设置VPN访问,以便用户必须首先建立VPN连接,然后在内部服务器上运行Web应用程序.

您还可以通过VPN将Web服务器连接到网络,并通过VPN链接直接访问内部登录服务,Web应用程序在WAN链接上运行.


在OP澄清要求之前,这是我的原始答案:

不太清楚你在问什么,所以我会回答我能想到的可能性.

如果您的意思是想让用户指定要发送帖子的服务器的IP地址,只需从IP地址构建URL:

HttpPost httppost = new HttpPost("http://" + ip + "/");
Run Code Online (Sandbox Code Playgroud)

如果您希望服务器根据用户的IP地址执行某些操作:当服务器收到请求时,服务器端将提供用户的IP地址,您无需明确发送.服务器端的具体访问方式取决于您使用的服务器.

如果您希望用户能够指定发送到服务器的IP地址,只需像发送其他参数一样发送:

params.add(new BasicNameValuePair("whatever", ip));
Run Code Online (Sandbox Code Playgroud)

如果您的意思是登录到依赖于用户IP地址的系统,代表远程用户从您的服务器登录,并且您想假装成该远程用户以便登录成功:您不能.您尝试登录的系统已采取安全措施,以防止您正在尝试执行的操作.也许该系统的所有者可能为您的服务器的IP地址添加例外; 你必须问他们.