Javascript 用于客户端游戏逻辑操作的Webapp安全性

Javascript 用于客户端游戏逻辑操作的Webapp安全性,javascript,ajax,html,security,Javascript,Ajax,Html,Security,我正在开发一款浏览器内游戏,利用HTML5提供的画布。然而,我意识到我的系统中有一个很大的漏洞。在客户端用Javascript计算游戏分数和其他关于游戏的统计数据,然后提交到服务器进行存储,并通过XMLHTTPRequest与其他玩家进行比较。这显然暴露了统计数据的操纵性和潜在的欺诈性 由于延迟问题,我担心将这些移动到服务器端。我预计时间很近 还有其他聪明的方法来解决这个问题吗?我想随着HTML5的发展,越来越多的游戏会处理这个问题。不太可能。在这种情况下,您的服务器只不过是一个信任客户机的数据

我正在开发一款浏览器内游戏,利用HTML5提供的画布。然而,我意识到我的系统中有一个很大的漏洞。在客户端用Javascript计算游戏分数和其他关于游戏的统计数据,然后提交到服务器进行存储,并通过XMLHTTPRequest与其他玩家进行比较。这显然暴露了统计数据的操纵性和潜在的欺诈性

由于延迟问题,我担心将这些移动到服务器端。我预计时间很近


还有其他聪明的方法来解决这个问题吗?我想随着HTML5的发展,越来越多的游戏会处理这个问题。

不太可能。在这种情况下,您的服务器只不过是一个信任客户机的数据库。您可以混淆,但人们将很容易理解您的api在做什么。这对于所有单机游戏来说都是一个棘手的问题,这就是为什么暴雪将Diablo3打造成一款客户机-服务器游戏的原因。事实上,它是一款javascript游戏,这使得它更加透明,人们可以轻松地调试和利用它

为什么不在客户端每次得分时向服务器发送数据,然后保留本地得分。

不幸的是,您对此无能为力。缩小/模糊代码始终是一个不错的选择。我不完全确定,但我认为把你的代码放进去

(function() { /* code */ })();
应保护所有变量不受用户编辑(除非将它们附加到像
窗口
这样的对象)。但是用户仍然可以利用您的ajax调用,向服务器发送他们想要的任何分数。只是,永远不要相信客户端所做的任何事情。在服务器端验证所有内容


编辑:我想到的另一件事是:可能在服务器端生成代码,并将其发送到浏览器。然后,在每次ajax调用中,发送该代码以验证是您而不是某个恶意用户。

当您必须信任来自客户端的数据时,无法实现100%的安全性。然而,通过混淆js代码和从客户端发送的数据,您可以很难进行欺骗

我有一个类似gView评论的想法

在服务器上,您应该通过批量更新来跟踪玩家的游戏进程,这些更新将在一定时间间隔内定期从客户端发送。。。玩家在延迟时间内不会识别它,你将拥有检测明显作弊者的工具。你知道玩家游戏的起点,所以你可以很容易地从一开始就发现作弊

另外,我建议使用一些检查点,在这些检查点中,您可以检查客户端上游戏的真实状态和服务器上的状态。(如果作弊者仅更改xhr更新的服务器,则客户端的状态不会更改)


有很多方法可以让作弊变得更难,而且每一场比赛都很有个性。。。没有标准可以解决所有问题。

我想补充一点,您可以在服务器端编写一些分析代码,使用您对游戏的了解和期望来帮助识别明显的作弊者。由于您已经在考虑这个问题,您对它的工作原理的理解使您能够向流中添加数据,这可能会使您更容易确定有人在玩您的系统。好吧,这并不能完全解决问题。这将是可能的手动ping服务器与一个点。Lol对不起,我是含糊不清。我没有补充的是,服务器将保留对模拟的授权跟踪。每次收到一个点数据包时,服务器都会返回世界(延迟模拟),处理物理过程并验证这是否可行。