我正在建立一个网站,在那里我需要时间用户的任务,显示时间,因为它过去了,并跟踪他们需要多长时间来完成任务。计时器应该是精确的第二,整个任务应该需要3-4小时的顶部。
我也应该防止用户伪造完成时间(没有钱,所以这不是真正的高风险,但有一些风险)。
目前,我使用时间戳来跟踪用户开始的时间,同时初始化基于JS的计时器,当用户完成任务时,我会得到通知,并计算当前时间和开始时间戳之间的差异--这种方法不好,用户的计时器和我的时间差之间有几秒钟的差异(即我计算用户完成任务所用的时间),注意:这只在我的dev env.测试,因为我没有其他的env。还.)。
我考虑过的其他两种方法是:
编辑:
下面是在算法措辞中所发生的事情:
问题-服务器计算的时间和客户端显示的时间是不同的。
任何洞察力都会很感激的。
发布于 2011-07-20 23:30:51
如果我的理解是正确的话,问题是服务器和客户端的时间略有不同,而且它们总是如此。
所以我会稍微修改一下你的原始序列如下:
由于延迟、服务器负载等原因,时间上会有细微的差异,因此通过使用客户端值,它将更准确,也更安全,因为这些值是正确检查的。
要回答这个问题:
您只能有一种精确性,或者根据客户机/用户所看到的,或者根据服务器所知道的精确性。来自客户端的任何东西都可能被污染,所以必须有一个妥协的地方。您可以通过测量和偏移来最小化这一点,这样,使用服务器时间,结束差在与开始差相同的范围内,但永远不会是100%不变的。如果真的有那么多问题,那就用不太精确的方式存储时间。
如果您确实必须具有准确性和可靠性,那么唯一的方法是使用服务器时间,并通过ajax周期性地获取它以供显示,并使用本地计时器来填补实际时间和报告时间之间的滑动调整算法的空白。
发布于 2011-07-18 03:52:39
我想这会管用的。似乎您有同步问题,也有密码学问题。我的建议是以用户不可见的方式解决同步问题,同时仍然保持安全性。
思想:计算和显示客户端,但使用密码技术,以防止用户发送伪造的时间。只要用户的报告时间接近服务器的测量时间,只需使用用户的时间即可。否则,索赔伪造。
因为用户的时间被接受(只要是合理的),用户永远不知道服务器时间可能与他们报告的时间不同步。因为你跟踪的时间很长,失去几秒钟的精确性看起来并不是个问题。该方法只需要对单个时间戳进行加密,因此应该是快速的。
发布于 2011-07-27 13:41:23
防止欺骗的唯一方法是根本不信任客户端,而只是将服务器上的最后时间计算为在收到结果后将任务发送到客户端之前所需的时间。
这也意味着,最后一段时间必须包括一些网络传输延迟,尽管这看起来很不公平:如果您试图以某种方式补偿它们,客户总是可以假装遭受比实际更多的延迟。
但是,您可以做的是确保网络延迟不会给用户带来惊喜。以下是一种完全防止欺骗的简单方法,同时考虑到对时钟速率和网络延迟的一些温和假设,确保在提交结果时客户端显示的运行时间大致与服务器上计算的最后时间相匹配:
这里的诀窍是客户端时钟是在从服务器请求任务之前启动的。假设步骤1和步骤2与步骤4和步骤5之间的单向网络传输延迟大致相同(并且客户机和服务器时钟运行速度大致相同,即使它们不同步),在客户端计算的从步骤1到步骤4的时间应该与从步骤2到步骤5在服务器上计算的时间相匹配。
从心理学的角度来看,让客户端时钟一直运行到最后一次从服务器收到为止,这可能是个好主意。这样,当运行中的时钟被最后一次替换时,跳转很可能是向后跳的,这使得用户比如果时间稍微向前跳更快乐。
https://stackoverflow.com/questions/6727940
复制相似问题