您好,我正在使用 node.js
、socket.io
和 canvas
编写游戏,并且想知道如何正确验证数据包。我的印象是用户可以使用数据包注入(inject)程序发送服务器不期望的数据包。例如,
- 发送一个参数之一超出正常范围(x 或 y 超出游戏空间)的数据包
- 发送极大的数据包来压垮服务器
- 发送带有服务器不期望的附加参数的数据包
- 发送一个包含数据的数据包,这些数据在读取时可以在服务器上执行命令(转义字符?)
- 一遍又一遍地发送相同的数据包来压垮服务器 (DoS)
为防止此类事件采取的典型措施是什么?有些子弹实际上不是问题吗?我错过了什么吗?是否有任何图书馆可以提供帮助?
最佳答案
我一次拿这些:
Send a packet with one of the parameters outside of normal bounds (x or y beyond game space)
这完全取决于您的服务器代码测试所有传入值以确保它们在适当的范围内。
Send extremely large packets to overwhelm the server
有一个关于如何保护socket.io免受这种DOS攻击的单独讨论。我会寻找链接并在找到时进行编辑。
Send a packet with additional parameters the server is not expecting
同样,这完全取决于您的服务器来验证所有传入数据。您的代码可能会忽略其他参数。 Socket.io 使用 JSON 格式发送“安全”的数据。额外的参数只会卡在外面,只要您的代码不访问它们,它们就不会造成任何损害。只是消息中存在一些额外的垃圾。
Send a packet with data that, when read, may execute commands on the server (escape characters?)
除非您的服务器在处理数据时做了一些危险的事情,否则这通常是不可能的。正如我之前所说,所有数据都以 JSON 形式发送,并以安全的方式进行解析,不存在任何已知的转义字符或其他类似漏洞。您必须确保完全验证您处理的任何数据,这样您就不会冒险将自己的服务器开放给诸如 SQL 注入(inject)之类的东西......这一切都与您对传入数据(特别是字符串)所做的操作有关)。对发送给您的字符串调用 eval()
之类的事情非常危险,但这通常不是人们会做的事情。
Send the same packet over and over to overwhelm the server (DoS)
对此的通常保护是速率限制,即限制单个客户端在给定时间内可以发送的数据包数量。如果它们超过某个阈值,您就断开它们。如果他们继续,您将禁止他们的用户帐户。
关于javascript - 如何验证来自 socket.io 的数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32832969/