1

我正在创建一个基于画布的游戏,其中包含一个重要的计时元素。游戏完成后,用户的完成时间将被发送到服务器上的 PHP/MySQL 以与其他玩家进行比较。

服务器端计时(即开始请求时间到提交请求时间)似乎会引入加载时间,因为它会影响用户的实际时间,因此在这种情况下效率低下。

我遇到的麻烦是确定一种方法来确保发送的时间是合法的。如何阻止某人使用他们的控制台并以提交虚假时间的方式编辑客户端代码?

任何帮助将不胜感激。

4

4 回答 4

8

你不能。永远不要相信客户。对您的服务器的每个请求都可能被欺骗。

于 2012-10-12T14:41:46.747 回答
1

你不能。简单地。

时钟可能运行缓慢,他们可能会更改开始和结束之间的日期/时间。

我参与了一个项目,我们放慢了时钟来观察一些行为。

所以不要相信客户。依靠你的时钟。那是你可以控制的。

(想一想——你在街上问一个陌生人的时间,他们的表可能有点快或慢。我的有点快,所以即使我迟到了,我也更有可能准时!)

于 2012-10-12T14:45:55.367 回答
0

在游戏开始时,ping 服务器并让服务器将其服务器时间保存到会话或其他持久性方法中。完成后将完成时间发送到服务器。在服务器上比较开始时间请求和结束时间请求之间的时间差以及从游戏提交的时间。允许一些时间上的差异,但就像 bergi 说的那样,它的工作量很大,但仍然不会是 100%。

流程图:

Game start -> send command to server. 
Server saves time: (2:53pm)

Game end -> send players time to server (3mins).
Server gets current time (2:56pm)

Server compares start time (2:53pm) with current time (2:56pm) which is 3mins.
IF the difference == 3mins +/- 30sec then assume time is valid.

根据您需要的严格程度以及您接受的公差来调整细节。- 请记住,客户甚至可能没有在玩游戏……任何请求都可能被欺骗。希望这是一个好的起点。

于 2012-10-12T14:49:53.980 回答
0

服务器端计时(即开始请求时间到提交请求时间)似乎会引入加载时间,因为它会影响用户的实际时间,因此在这种情况下效率低下。

它可以。欢迎来到令人兴奋的在线游戏世界。这是您的服务器端应用程序需要更高级的地方,您可以在其中修改人们的时间以使其更公平。应执行 Pings/traceroutes 以了解延迟。

我遇到的麻烦是确定一种方法来确保发送的时间是合法的。如何阻止某人使用他们的控制台并以提交虚假时间的方式编辑客户端代码?

不太确定 HTML5 在这方面是否有任何进步——我不希望它会——但是,一种方法是使用 Flash,或者使用浏览器之外的应用程序,这可能会破坏你最初使用 JavaScript 的目的地方。

于 2012-10-12T14:54:42.143 回答