13

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

4

2 回答 2

16

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

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

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

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

于 2010-06-05T03:33:28.147 回答
4

再加上拉里所说的,你肯定必须在后端处理得分,以真正防止作弊/假分数发布。

举个实践中的例子... 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(这个答案的最大链接数)

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

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

我写了一篇博文,更详细地介绍了 HTML5 游戏安全性。HTML5 游戏开发技巧系列的第 3 部分

于 2012-09-19T01:53:00.963 回答