我有一个其他人写的多线程服务器应用程序。当它要接受带有ServerSocket的套接字对象时,它是通过一个名为"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))。
谢谢您对此方法的任何解释!
发布于 2014-07-03 06:37:58
这是默默无闻的安全。套接字无论如何都会被接受,只是检查客户端是否将0x0E (14)作为第一个字节发送。如果没有,则抛出(而不关闭接受的套接字)。
只要在连接后不发送任何东西,这件事仍有可能.
编辑:仔细看,它甚至不需要是分布式攻击。一个客户机只要没有发送任何字节,就会完全阻塞accept循环,任务就完成了。不管是谁写的都不知道他在做什么。
发布于 2014-07-03 06:37:20
一点也不安全。这会让事情更糟。
此代码在接受线程上执行客户端I/O操作。这意味着,恶意客户端安装DOS攻击所需做的就是连接和发送任何东西。然后,只有在客户端发送或关闭连接之前,才能接受其他客户端。
至于它所做的事情,它只是拒绝了不以14字节开头的客户端连接。这是一个很弱的测试:256个随机尝试中就有1个会通过。通过在应用程序协议中进行适当的错误检查,可以更好地完成这一任务。无论如何,你还是要这样做,所以根本就没有实际的优势。
此代码还泄漏已拒绝的套接字。
把它扔掉。
https://stackoverflow.com/questions/24555185
复制相似问题