Java:安全套接字接受

时间:2014-07-03 13:36:13

标签: java sockets

我得到了别人写的这个多线程服务器应用程序。 什么时候用它的ServerSocket-object接受Socket-object, 它通过名为" acceptSocketSafe"的方法运行。

以下是该程序的片段,其中包含了所需的部分代码:

public Socket acceptSocketSafe(ServerSocket x)  {
    boolean socketFound = false;
    Socket socket = null;

    do  {
        try {
            socket = x.accept();
            int i = socket.getInputStream().read();

            if ((i & 0xFF) == 14)   {
                socketFound = true;
            }
        } catch (Exception e)   {

        }
    } while (!socketFound);

    return socket;
}

我不明白的方法是" acceptSocketSafe"使套接字接受比我做的更安全(简单,常规的方式)。 (我相信它可以排除不良意图的连接(例如DDoS))。

感谢您对此方法的任何解释!

2 个答案:

答案 0 :(得分:1)

它根本不会让它更安全。这让事情变得更糟。

此代码在接受线程上执行客户端I / O.这意味着所有恶意客户端必须做的就是连接并发送任何东西。然后,在该客户端发送内容或关闭连接之前,不能接受任何其他客户端。

至于它的作用,它只是拒绝不以14字节开头的客户端连接。这是一个相当弱的测试:256个随机尝试中的1个将通过。通过应用程序协议中的适当错误检查可以更好地完成。无论如何你仍然必须这样做,所以根本没有实际的优势。

此代码也会泄漏被拒绝的套接字。

扔掉它。

答案 1 :(得分:1)

这是默默无闻的安全。无论如何都接受套接字,只是它检查客户端发送0x0E(14)作为第一个字节。如果它没有,它会抛出(没有关闭接受的套接字btw。)。

这仍然可以通过连接后不发送任何内容来进行DDoS ...

编辑:仔细观察,它甚至不需要是分布式攻击。单个客户端只是不发送任何字节将完全阻止接受循环,完成任务。写这篇文章的人并不知道他在做什么。