【问题标题】:How to get Client Ip address at Proxy server in HttpResponse in java?java - 如何在java中的HttpResponse中获取代理服务器的客户端IP地址?
【发布时间】:2016-05-04 20:22:46
【问题描述】:

我正在尝试在 java 中实现一个代理服务器,它将从客户端浏览器获取 HttpRequest,将其转发到服务器。 从服务器接收到 HttpResponse 后,提取 cookie 并修改 cookie,然后转发 HttpResponse 和修改后的 cookie 到客户端浏览器。我这样做是为了防止滥用 cookie 进行会话劫持。

下次,当客户端尝试连接同一台服务器时,我的代理服务器将使用此修改后的 cookie 获取 HttpRequest。 在将该 HttpRequest 转发到服务器之前,我的代理服务器将用原始替换此修改后的 cookie 服务器会响应,因为它会检测到正确的 cookie。

此方法的一个缺点是,如果同一局域网的其他客户端成为攻击者并窃取客户端的修改过的 cookie 并发送 HttpRequest 到代理服务器,代理服务器将把修改后的 cookie 替换为原始的并转发到服务器,攻击者将能够执行 会话劫持。

为了解决这个问题,我试图通过以下方式来实现它。

我将存储 (Ip, cookie 原始值)= 修改后的值,而不是 (cookie original value= modified value)。所以任何时候 HttpReqest 来自客户端浏览器,我将检查发件人的 IP 地址以及与原始 cookie 一起存储的 IP 地址以获取此修改后的 cookie。

我尝试在单机上运行此代码,我已将所有浏览器请求重定向到本地端口 1111,并且我能够获取客户端 IP 地址。

 public static void runServer(String host, int remoteport, int localport)
      throws IOException {

// Create a ServerSocket to listen for connections with
ServerSocket ss = new ServerSocket(1111);

final byte[] request = new byte[1024];
byte[] reply = new byte[4096];

while (true) {
  Socket client = null, server = null;
  try {
    // Wait for a connection on the local port
    client = ss.accept();

    final String SenderIp=client.getInetAddress().getHostAddress();
    System.out.println("Client Ip address "+ SenderIp);

.....

// cookie convertion moodified to original is done here
   (modified cookie ---> original cookie value)
.....



// forward HttpRequest to server 
byte[] requestBytes = requestString.getBytes("ISO-8859-1");
streamToServer.write(requestBytes,0,requestBytes.length);
streamToServer.flush();

}   



// Read the server's responses
        // and pass them back to the client.
        int bytesRead;
        try {
          while ((bytesRead = streamFromServer.read(reply)) != -1) {

        String responseString = new String(reply, 0, bytesRead, "ISO-8859-1");
         System.out.println("Reply string "+responseString);


        // cookie modification done here

        System.out.println("Forwarded to IP "+SenderIp);
        byte[] responseBytes = responseString.getBytes("ISO-8859-1");
        streamToClient.write(responseBytes, 0, responseBytes.length);
        streamToClient.flush();

        HashMap(original_cookie,  modified cookie)
}
}   

我如何知道 IP 地址 此 HttpResponse 将发送给谁?我的意思是我将发送修改 cookie 的客户端 IP 地址

我想在从外部服务器获得 HttpResponse 后使用 HashMap(original_cookie,IP address, modified cookie)。

提前谢谢你。

【问题讨论】:

  • 您可以从request 上的X_Forwarded_For(或更新的Forwarded)标头获取它。
  • @ElliottFrisch,感谢您的及时答复。我正在使用核心java。 X_Forwarded_For 在 servlet 中可用。任何选项核心java套接字编程?
  • 我不确定我是否明白你在问什么; X_Forwarded_For 通常由代理添加(这就是您正在编写的内容)。
  • @ElliottFrisch,我防止滥用 cookie 的方法是 (ip,original cookie)-->modified cookie,稍后我可以与发件人 IP(攻击者或有效客户端)和从中检索的 IP 进行交叉检查修改过的 cookie --> 原始 cookie,IP)。还有其他更简单或更好的方法来防止滥用 cookie 吗?
  • 为什么不将cookie id和ip地址存储在一起,那么如果你从一个不匹配的ip地址得到一个cookie你可以丢弃它。这种方法的问题是大多数人没有静态 IP 地址。

标签: java cookies proxy


【解决方案1】:

我得到了解决方案。我正在新客户端和服务器之间创建一个单独的套接字。因此,我们可以轻松地从特定客户端和服务器之间的套接字中检索单个客户端的 IP 地址。

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多