HTML5 多人游戏安全解决方案

Posted

技术标签:

【中文标题】HTML5 多人游戏安全解决方案【英文标题】:HTML5 Multiplayer Game Security Solutions 【发布时间】:2011-02-28 01:39:45 【问题描述】:

现在已经有几个 html5 中经典平台甚至 3D fps 游戏的简洁画布演示,下一步可能是尝试开发多人 HTML5 游戏。 HTML5 套接字支持使这相对简单,但是任何人都可以在浏览器中查看客户端源代码,HTML5 前端多用户游戏的基本游戏安全功能有哪些解决方案 -- 比如能够防止伪造的高分提交?

【问题讨论】:

【参考方案1】:

简单的答案是:你不能信任来自客户端的数据,这意味着高分提交不能来自客户端。

由于代码客户端可供任何人检查,因此无法信任客户端发送给您的服务器的数据。即使您使用每个用户的加密密钥加密数据(这是可能的),用户也可以简单地在浏览器中更改您的代码并更改它发送到服务器的值。

由于您的游戏是多人游戏,如果服务器生成所有计分事件,这可能是可能的。如果服务器生成所有的评分事件,客户端永远不会向服务器发送分数数据,这意味着高分数据不能被伪造。

你仍然需要处理作弊,这更具挑战性,但这是另一个问题......

【讨论】:

我仍在考虑服务器生成计分事件的工作方式......似乎不可避免地,客户端会启动一些反馈以使游戏具有交互性 - 例如单击或按下一个按钮,假设每个评分过程都发送到服务器,最终将被转换为一个套接字/URL 调用。由于发送此评分事件的 URL 是公开的(并且没有办法避免这种情况?),似乎人们可以通过在 URL 上设置刮板来轻松滥用它,甚至。什么样的游戏只能有服务器限制的计分事件? @ina:几乎所有商业在线游戏都在服务器上完成所有评分。客户端启动操作,但服务器解决它们并决定结果。 @ina:kylotan 说了什么。不要有“生成分数”事件。有一个“玩家采取这个行动”事件。如果操作导致生成分数,则在服务器上生成分数。这意味着您的客户端只不过是服务器生成的事件的显示 - 实际上没有在客户端执行的游戏元素,它们都发生在服务器上并在客户端上呈现。 好的,像这样?服务器随机生成“命中分数可能性”,有效用户生成的“命中”的时间和空间窗口有限(即,单击某个框,在接下来的 3 秒内......)通过服务器 url 发送的信息虽然......所以。 .. 超时,对于有人通过创建超级 ping 机器人滥用服务器调用 url 的情况,例如? 你想多了。可以这样想:客户端发送“玩家攻击”消息并启动“玩家攻击”动画。服务器决定玩家是否击中并发送“你击中了!”或“你错过了!”消息返回给客户端。服务器会记录生命值、生命值等。当一名玩家死亡时,服务器会向死亡玩家发送“你死了”消息,并向正在杀死的玩家发送“你杀死了他们”消息。所有的统计和记录保存在服务器上,客户端除了显示 UI 什么都不做。同样的想法也适用于其他游戏类型(扑克等)。【参考方案2】:

除了 Larry 所说的,您肯定必须在后端处理评分,以真正防止作弊/虚假分数发布。

举个实践中的例子...Word Wars 游戏是一个令人困惑的游戏,您可以从 4x4 字母网格中找到尽可能多的单词。

在每场比赛开始时,服务器端都会生成一个 4x4 棋盘。生成该板的可能单词列表,并将每个单词的散列版本(带有随机盐的 md5'd)以及盐传递给客户端。

在客户端,当输入字母并按下回车键时,我们 md5(使用来自服务器的盐)输入的单词,并根据服务器提供的散列单词列表检查该单词。如果匹配,我们会使用新分数更新客户端(有一个基于使用的字母及其分值的函数)。

游戏结束后,客户端将他们想出的单词列表发送给服务器(不是分数),服务器会再次检查这些单词是否存在于棋盘中,并处理评分。

这就是我工作的公司 Clay.io 的用武之地。Clay.io 为高级 HTML5 游戏功能(如排行榜、成就、支付处理等)提供了一个 API……不用说,我们需要一种针对具有后端的游戏的解决方案,可以使高分等某些事情更加安全。

解决方案是使用 JWT(JSON Web 令牌)在后端(node.js、php 等)上加密 javascript 对象,并传递该加密对象而不是分数本身。这让我们可以双向交流(游戏 -> Clay.io 和 Clay.io -> 游戏),而且非常轻松。完整的文档在这里:clay.io/docs/encryption(这个答案的链接最多)

回到 Word Wars... 我们从服务器生成带有用户分数的 JWT,并将其传递给 Clay.io 以发布分数。瞧 :)

当然,这会随着你开发的游戏类型的不同而不同,但故事的寓意是你必须要有创意:)

我写了一篇博文,更详细地介绍了 HTML5 游戏安全性。 Part 3 of a series on HTML5 Game Development Tips.

【讨论】:

是的,他们可以在游戏中扔掉每个字典单词并找到某个地方……当然,您可以检查失败率,看看是否有人真的这样做了。一个“破解”它的人最终构建了一个拼字游戏求解器——不幸的是,没有办法解决这个问题(就像 Words With Friends 无法在等价的拼字游戏中阻止这种事情一样)

以上是关于HTML5 多人游戏安全解决方案的主要内容,如果未能解决你的问题,请参考以下文章

我想创建一个基于 HTML5 + python (tornado) 的多人游戏:)

编写多人国际象棋游戏:HTML5 Canvas + ReactJS vs. Phaser 3

WebRTC 是正确的吗? (实时多人游戏)

多人 HTML5、Node.js、Socket.IO

多人在线游戏,客户端服务器间同步低延迟方案(译)

游戏开发实战Unity从零开发多人视频聊天功能,无聊了就和自己视频聊天(附源码 | Mirror | 多人视频 | 详细教程)