【发布时间】:2011-02-28 01:39:45
【问题描述】:
现在已经有几个 HTML5 中经典平台甚至 3D fps 游戏的简洁画布演示,下一步可能是尝试开发多人 HTML5 游戏。 HTML5 套接字支持使这相对简单,但是任何人都可以在浏览器中查看客户端源代码,HTML5 前端多用户游戏的基本游戏安全功能有哪些解决方案 -- 比如能够防止伪造的高分提交?
【问题讨论】:
标签: security html canvas multiplayer
现在已经有几个 HTML5 中经典平台甚至 3D fps 游戏的简洁画布演示,下一步可能是尝试开发多人 HTML5 游戏。 HTML5 套接字支持使这相对简单,但是任何人都可以在浏览器中查看客户端源代码,HTML5 前端多用户游戏的基本游戏安全功能有哪些解决方案 -- 比如能够防止伪造的高分提交?
【问题讨论】:
标签: security html canvas multiplayer
简单的答案是:你不能信任来自客户端的数据,这意味着高分提交不能来自客户端。
由于代码客户端可供任何人检查,因此无法信任客户端发送给您的服务器的数据。即使您使用每个用户的加密密钥加密数据(这是可能的),用户也可以简单地在浏览器中更改您的代码并更改它发送到服务器的值。
由于您的游戏是多人游戏,如果服务器生成所有计分事件,这可能是可能的。如果服务器生成所有的评分事件,客户端永远不会向服务器发送分数数据,这意味着高分数据不能被伪造。
你仍然需要处理作弊,这更具挑战性,但这是另一个问题......
【讨论】:
除了 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.
【讨论】: