Javascript 如何安全地测量用户';是时候了

Javascript 如何安全地测量用户';是时候了,javascript,Javascript,我想测量用户完成任务(回答测验)所需的时间。我想准确地测量它,没有网络延迟。这意味着,如果我在服务器端测量两个请求之间的时间,它将不是用户所用的实时时间,因为网络时间是考虑在内的 但另一方面,如果我用javascript度量并将时间戳发布到服务器,用户将能够看到代码,并通过发送错误的时间戳进行欺骗,不是吗 如何在javascript中获取时间戳并确保用户没有伪造时间戳?通常在客户端代码中,以“如何安全…”开头的任何问题都以“不可能”回答。什么都没有,甚至没有把变量放在闭包中(因为我,这个邪恶的作

我想测量用户完成任务(回答测验)所需的时间。我想准确地测量它,没有网络延迟。这意味着,如果我在服务器端测量两个请求之间的时间,它将不是用户所用的实时时间,因为网络时间是考虑在内的

但另一方面,如果我用javascript度量并将时间戳发布到服务器,用户将能够看到代码,并通过发送错误的时间戳进行欺骗,不是吗


如何在javascript中获取时间戳并确保用户没有伪造时间戳?

通常在客户端代码中,以“如何安全…”开头的任何问题都以“不可能”回答。什么都没有,甚至没有把变量放在闭包中(因为我,这个邪恶的作弊用户可以在我这端更改代码并将其发送给你)


这种验证应该在服务器端执行,即使存在网络延迟的缺点

这里的诀窍是使用JavaScript测量时间,但也可以使用服务器端代码跟踪时间。这样,您就可以依赖客户端接收到的时间戳,只要您强制执行计算时间之间的最大差异。我认为几秒钟就足够了。然而,通过这样做,您正在为失败创建一个额外的向量


编辑:如果用户能够利用(缺少)网络延迟,他们可以通过最大的强制差异来调整自己的时间。在为我的项目设计在线考试门户时,我遇到了同样的问题。 我选择了混合方法

  • 在用户加载页面时从服务器获取时间,并基于javascript启动计时器。在数据库中记录开始时间
  • 让计时器在客户端运行一段时间,比如说30秒
  • 通过向服务器发出AJAX调用以根据已过的时间重置计时器来刷新计时器
  • 注意:尝试使用外部javascript并混淆计时器的代码,使猜测变得困难

  • 这样,您可能无法完全阻止用户修改计时器,但您可以将最大可能错误限制为30秒。

    您不能!无论您尝试什么,javaScript都是客户端的,它的代码对有经验的用户是可见的——他总能找到一种发送伪造时间戳的方法。您的服务器需要进行时间测量。关于延迟-你认为你的智力竞赛游戏会遭受50毫秒的网络延迟吗?知道服务器值和客户端代码中不可信值之间的增量时间有什么好处?@jdpenix实际上,这是一个智力竞赛。OP想要做的就是获得完成测验所需时间的准确测量值,这只能从不受信任的客户端获得。然而,如果你真的想一想,这种方法将有效地防止恶意使用。这不是一个旨在保护国家安全局绝密文件的算法。只是时间的度量。有时候,只想一个适合场景的解决方案更明智。就是这样。