给定一个简单的网络协议“command arg0 arg1 argn\n”作为数据流,如果你连续向这样的服务器发送数据,而不发送换行符,这是否会导致拒绝服务攻击,通过导致简单的服务器出现内存不足错误?
我很感兴趣,因为我在 uni 获得了一个 java 任务,它已经定义了网络协议,并且没有提到最大数量的参数,或命令/参数的最大长度。
我要创建一个遵守此协议的客户端和服务器,并且具有抵御攻击的能力,但是缺少最大消息大小真的让我吃不消。
给定一个简单的网络协议“command arg0 arg1 argn\n”作为数据流,如果你连续向这样的服务器发送数据,而不发送换行符,这是否会导致拒绝服务攻击,通过导致简单的服务器出现内存不足错误?
我很感兴趣,因为我在 uni 获得了一个 java 任务,它已经定义了网络协议,并且没有提到最大数量的参数,或命令/参数的最大长度。
我要创建一个遵守此协议的客户端和服务器,并且具有抵御攻击的能力,但是缺少最大消息大小真的让我吃不消。
它会导致内存不足错误吗?
可能,是的。
一个简单的服务器可能会尝试将整行读入 a StringBuffer
,然后再将其拆分为命令和参数。(例如,这是BufferedReader.readLine()
或Scanner.nextLine()
将要做什么。)这StringBuffer
可能会变得足够大以填满堆。( a 的最大大小StringBuffer
是2^31
chars ...并且空间使用量可以暂时增加一倍。)
即使服务器更加小心,如果它需要所有参数(对于普通命令)才能开始处理命令,它仍然会遇到问题。如果您(以某种方式)处理了这个问题,请考虑命令名称或单个参数是~2^31
字符长的可能性。
击败这些潜在 DOS 攻击的唯一现实方法是对请求消息的长度设置防御限制。
我很感兴趣,因为我在大学被分配了一个 java 作业......
...是的,您可能想多了,除非有书面要求您的解决方案能够抵御拒绝服务攻击。请记住,这是一个练习......不是建立一个真正的生产强度系统的要求。
如果您正在制作一个真实的系统,您将与“客户”讨论这个问题并制定处理它的方法;例如,修改协议规范以包含消息长度限制。
不,不是。即使协议正在等待新行来处理数据,也有许多级别的缓冲区。例如,如果您的服务器没有足够快地读取您的数据,它的 TCP 接收缓冲区将已满,并且它的操作系统将开始停止向您发送回确认数据包,这反过来又会阻止您对write
.
那是针对网络层的。但是,如果您的服务器实现将总 String 保存在内存中,它可能会导致OutOfMemoryError
但一个好的实现可能会受到保护。