如何验证来自 socket.io 的数据包?

Posted

技术标签:

【中文标题】如何验证来自 socket.io 的数据包?【英文标题】:How to validate packets from socket.io? 【发布时间】:2015-09-28 22:46:30 【问题描述】:

您好,我正在使用 node.jssocket.iocanvas 编写游戏,并且想知道如何正确验证数据包。我的印象是用户可以使用数据包注入程序来发送服务器不期望的数据包。例如,

发送一个数据包,其中一个参数超出正常范围(x 或 y 超出游戏空间) 发送超大数据包以压垮服务器 发送带有服务器不期望的附加参数的数据包 发送包含数据的数据包,当读取该数据时,可能会在服务器上执行命令(转义字符?) 反复发送相同的数据包以压倒服务器 (DoS)

防止此类事情发生的典型措施是什么?有些子弹不是真正的问题吗?我错过了什么吗?有没有图书馆可以帮助解决这些问题?

【问题讨论】:

您所描述的技术称为Fuzz Testing。有用于进行此类测试的自动化工具;没有我可以特别推荐的,所以我将把它留给你自己的研究。一般来说,尽管您应该验证所有输入,无论来源如何,以确保它符合预期,并且像 (D)DoS 这样的特定问题是服务器不容易管理的特定类别,更不用说服务器脚本了引擎。这个想法是,如果有人提交一个 2mb 的字符串而不是 1/0 值,则会触发错误。 是的,您应该始终验证用户输入,即使来自套接字。你的第四个案例不会发生。 @dandavis:这很大程度上取决于服务器在做什么。例如,如果它直接调用 OS 命令,那么请参阅这篇文章 OS Command Injection 了解可能出错的一些示例。此外,如果有任何本机代码在运行,这可能会导致缓冲区溢出。 【参考方案1】:

我会一次拿这些:

发送一个数据包,其中一个参数超出正常范围(x 或 y 超出游戏空间)

这完全取决于您的服务器代码测试所有传入的值,以确保它们在适当的范围内。

发送超大数据包以压垮服务器

关于如何保护 socket.io 免受此类 DOS 攻击的单独讨论。我会去寻找链接并在找到时进行编辑。

发送带有服务器不期望的附加参数的数据包

同样,这完全取决于您的服务器来验证所有传入数据。您的代码可能会忽略其他参数。 Socket.io 使用 JSON 格式发送“安全”的数据。额外的参数只是闲逛,只要您的代码不访问它们,它们就没有害处。只是消息中出现了一些额外的垃圾。

发送一个包含数据的数据包,当读取该数据时,可以在该数据包上执行命令 服务器(转义字符?)

这通常是不可能的,除非您的服务器在处理数据时做了一些危险的事情。正如我之前所说,所有数据都以 JSON 格式发送,并以安全的方式进行解析,没有任何已知的转义字符或其他此类漏洞的漏洞。您必须确保您正在完全验证您处理的任何数据,这样您就不会冒险将自己的服务器打开到诸如 SQL 注入等之类的东西......这一切都与您对传入数据所做的事情有关(尤其是字符串)。像在发送给您的字符串上调用 eval() 这样的事情是非常危险的,但通常不会这样做。

一遍又一遍地发送相同的数据包以压倒服务器(DoS)

通常的保护措施是速率限制,您可以限制单个客户端在给定时间内可以发送的数据包数量。如果它们超过某个阈值,则断开它们。如果他们继续,您将禁止他们的用户帐户。

【讨论】:

谢谢,这正是我想要的! :D 很好的答案。您找到Send extremely large packets to overwhelm the server 的好链接了吗?很遗憾,我自己还没有找到。 @Tholle - 我没有找到对大数据包的保护。有关于人们想要它的讨论,但我没有找到任何关于实现的讨论。 我明白了。可能会考虑自己实施它。感谢您的宝贵时间。

以上是关于如何验证来自 socket.io 的数据包?的主要内容,如果未能解决你的问题,请参考以下文章

如果几乎同时发送Socket.io'组合'数据包吗?

Node.js 和 Socket.io UTF8 验证 TypeError 来自 ws

socket.io 身份验证与共享会话数据,io.use() 如何工作

什么是webSocket?怎么使用webSocket中的第三方socket.io包

socket.io-client-swift 包解析在 Xcode13 Beta 项目中失败

来自 socket() 的 UDP 数据包标头与预期不符