0

我有一个测验网络应用程序,测验的玩家有 20 秒的时间来回答每个问题,并且会因为回答得更快而获得时间奖励。

有哪些方法可以记录用户回答难以/不可能操作的问题所花费的时间?

可能会有奖励给得分最高的玩家,因此会有操纵帖子数据的动机。

到目前为止,这是我唯一的想法,但对我来说似乎很容易操纵:

  1. 问题将通过 AJAX 加载。
  2. 存储玩家通过 JavaScript 接收问题的时间(以毫秒为单位)。
  3. 为每个问题分配一个哈希值,为每个单独的答案分配一个哈希值。
  4. 当玩家选择一个答案时,创建一个新的哈希值,其中包含问题的哈希值 + 答案的哈希值 + 总时间差的哈希值(以毫秒为单位)。
  5. 将该哈希发布到我的服务器。
  6. 服务器端我将拥有所有可能的有效哈希的缓存索引,用于该问题的正确答案+时间组合。(每个问题总共 20,000 个哈希值。每毫秒一个,最多 20 秒)
  7. 如果提交的哈希与索引中的一个匹配,则玩家将获得正确答案和他们的时间奖励。

我还考虑过使用加密的 Flash 文件来处理要提交的哈希,但除非我弄错了,否则很容易在这些文件上使用反编译器来查看发生了什么。所以它并没有提供更多的安全性。

有人有其他想法吗?

编辑 - 我一直在考虑这个问题,以至于我完全忘记了用户能够改变他们的时钟,这使得任何安全地做这个客户端的机会都无效。

因此,服务器端时间戳确实是唯一可靠的方法。

4

3 回答 3

4

简单的回答:不要相信客户所说的任何事情,如果可能的话,不要对客户做任何事情。

为此使用服务器端录制。例如

  1. 当“给我问题文本”请求进入时设置会话变量记录时间
  2. 设置会话可变录制时间,当答案进来时

繁荣。用户可以影响这一点的唯一方法是询问问题文本并发送答案。更改他们的系统时钟,捏造浏览器中的数据,捏造 HTTP 请求中的数据,因为它击中线路 - 所有这些都是无用的。

于 2012-08-17T16:05:30.030 回答
0

如果您使用的是 PHP,您可以$_SESSION['receivedQuestion'] = time();在用户收到问题时设置 a,在用户回答问题时检查time()-$_SESSION['receivedQuestion'] <= 20. 请注意,当用户的互联网连接速度较慢时,这可能会带来一些麻烦,但这应该不是太大的问题。

于 2012-08-17T16:05:17.197 回答
0

为什么在提出问题时不使用服务器端时间戳,而在正确回答时使用另一个时间戳?

我了解请求延迟可能会导致问题,但将其留给客户并不是很安全。

于 2012-08-17T16:05:32.647 回答