如何处理协议错误?

时间:2015-01-25 06:39:09

标签: tcp network-programming

使用TCP构建框架的正确方法或技术是什么?

我在node.js服务器中创建了一个简单的成帧器,它在每个消息进入时对第一个字节的数据包大小进行帧化。

但有一个问题:如果用户故意发送无效数据包该怎么办。

类似的东西:

0A 00 03 04 05

我们可以判断这是一个损坏的数据包,0A是大小,但我们可以看到实际大小只有05

我们如何防止此类攻击?

4 个答案:

答案 0 :(得分:1)

如果收到垃圾,请关闭插座。坚持不懈。同行不会说你的语言,或故意试图让你崩溃或利用漏洞。不要让他。

答案 1 :(得分:1)

TCP是基于流的,不适用于边界。因此recv()返回部分数据可能是真实的。或者可能有无效的同伴只想弄乱连接。 TCP无济于事。责任在于申请采取行动。

如果没有完全接收到数据(长度为字节数),则应用程序必须具有放弃的逻辑。可以是一个计时器,在该计时器到期时,应用程序应将连接标记为无效,然后执行close()

答案 2 :(得分:0)

您不能,因为您的协议中没有任何内容可以让您验证指定的大小是否正确。

您可以为每条消息附加一个控制字符(例如ascii 03):

<length><body><footer char>

然后攻击者可以写:

03 32 32 32 03 32 32 32

您的验证可行,但下一条消息将被搞砸。

防止这种情况的唯一方法是确保实际正文包含合理的值并断开客户端,如果它没有。

答案 3 :(得分:0)

只需验证所有输入。如果客户端发送&#34; N个字节到来&#34;然后读N个字节。如果你读得少(因为在获得N个字节之前流已耗尽)将其解释为连接问题或某处的错误,请记录该事件并中止连接。