给定一个简单的网络协议(protocol)“command arg0 arg1 argn\n”作为数据流,如果您连续向这样的服务器发送数据,而不发送换行符,这是否会导致拒绝服务攻击,通过导致简单的服务器会因内存不足错误而出错?
我很感兴趣,因为我在大学得到了一份 java 作业,该作业已经定义了网络协议(protocol),并且没有提及最大参数数量或命令/参数最大长度。
我要创建一个遵守此协议(protocol)的客户端和服务器,并且能够抵御攻击,但是缺乏最大消息大小确实让我感到困扰。
最佳答案
Would it cause an out of memory error?
有可能,是的。
一个简单的服务器可能会尝试将整行读入StringBuffer
,然后再将其拆分为命令和参数。 (例如,这就是 BufferedReader.readLine()
或 Scanner.nextLine()
将会执行的操作。)StringBuffer
可能会变得足够大,填充堆。 (StringBuffer
的最大大小为 2^31
个字符...并且空间使用量可以暂时达到两倍。)
即使服务器更加小心,如果在开始处理命令之前需要拥有所有参数(对于普通命令),它仍然可能会遇到问题。如果您(以某种方式)处理过这个问题,请考虑命令名称或单个参数的长度为 ~2^31
个字符的可能性。
击败这些潜在 DOS 攻击的唯一现实方法是对请求消息的长度设置防御限制。
<小时/>I'm interested because I've been given a java assignment at uni ...
...是的,您可能想得太多了,除非有书面要求,要求您的解决方案能够抵御拒绝服务攻击。请记住,这是一项练习...而不是建立真正的生产强度系统的要求。
如果您正在开发一个真实系统,您将与“客户”讨论这个问题并找出处理它的方法;例如修改协议(protocol)规范以包含消息长度限制。
关于java - 连续向简单服务器发送数据会导致内存不足错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17082725/