我得到了别人写的这个多线程服务器应用程序。 什么时候用它的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))。
感谢您对此方法的任何解释!
答案 0 :(得分:1)
它根本不会让它更安全。这让事情变得更糟。
此代码在接受线程上执行客户端I / O.这意味着所有恶意客户端必须做的就是连接并发送任何东西。然后,在该客户端发送内容或关闭连接之前,不能接受任何其他客户端。
至于它的作用,它只是拒绝不以14字节开头的客户端连接。这是一个相当弱的测试:256个随机尝试中的1个将通过。通过应用程序协议中的适当错误检查可以更好地完成。无论如何你仍然必须这样做,所以根本没有实际的优势。
此代码也会泄漏被拒绝的套接字。
扔掉它。
答案 1 :(得分:1)
这是默默无闻的安全。无论如何都接受套接字,只是它检查客户端发送0x0E(14)作为第一个字节。如果它没有,它会抛出(没有关闭接受的套接字btw。)。
这仍然可以通过连接后不发送任何内容来进行DDoS ...
编辑:仔细观察,它甚至不需要是分布式攻击。单个客户端只是不发送任何字节将完全阻止接受循环,完成任务。写这篇文章的人并不知道他在做什么。