Java:安全套接字接受
我得到了其他人编写的多线程服务器应用程序。 当它要用它的ServerSocket对象接受套接字对象时, 它通过一个名为“acceptSocketSafe”的方法运行 以下是程序的一个片段,其中包含了所需的部分代码:Java:安全套接字接受,java,sockets,Java,Sockets,我得到了其他人编写的多线程服务器应用程序。 当它要用它的ServerSocket对象接受套接字对象时, 它通过一个名为“acceptSocketSafe”的方法运行 以下是程序的一个片段,其中包含了所需的部分代码: public Socket acceptSocketSafe(ServerSocket x) { boolean socketFound = false; Socket socket = null; do { try {
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)有关)
谢谢你对这个方法的解释 这一点也不安全。这让情况变得更糟 此代码在接受线程上执行客户端I/O。这意味着恶意客户端要发起DOS攻击所要做的就是连接并不发送任何内容。然后,在该客户机发送内容或关闭连接之前,不能接受其他客户机 至于它做什么,它只是拒绝不以14字节开始的客户端连接。这是一个相当弱的测试:256次随机尝试中有1次会通过。通过在应用程序协议中进行适当的错误检查,可以更好地实现这一点。无论如何,你仍然必须这样做,因此根本没有实际的优势 此代码还泄漏被拒绝的套接字
扔掉它。这是默默无闻的安全。套接字仍然被接受,只是它检查客户端是否发送0x0E(14)作为第一个字节。如果没有,则抛出(顺便说一句,不关闭接受的套接字) 连接后不发送任何内容仍然可能导致DDoS攻击
编辑:仔细看,它甚至不需要是分布式攻击。一个客户端只要不发送任何字节,就会完全阻塞accept循环,任务完成。不管是谁写的,他都不知道自己在做什么。每个客户都必须发送14号价值,否则服务器就不会跟他说话。它不能防止ddos攻击,但可以区分正确的客户端连接或正确版本的客户端。带有0xFF和布尔值的掩码是冗余的。将该方法命名为“AcceptClientorGoodGuessErrorBlockIndefinitelyInWorldsSimplestDosAttack()”更合适。