java - 连续向简单服务器发送数据会导致内存不足错误吗?

标签 java

给定一个简单的网络协议(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/

相关文章:

java - 如何在下载时获取查看格式的 pdf 文件而不保存或另存为选项

java - 如何用jenkins部署java项目

java - MetadataMBeanInfoAssembler 不支持 JDK 动态代理

java - java中存储一键三值应该用哪个集合?

java - UnboundID、LDAP jdk迁移

java - android测试-EditText即使有字符也返回空

java - 坚持从另一个类调用 ArrayList

java swing关闭窗口而不退出应用程序

java - 如何从 Java 源代码生成序列图?

java - Jackson 展开/包裹对象