Javascript中的防欺骗时间

Javascript中的防欺骗时间,javascript,time,Javascript,Time,我正在开发一个web应用程序,它必须测量用户做某事所需的时间。我不能简单地使用javascript时间对象,因为用户可能会更改系统时间来欺骗和愚弄应用程序。我需要一些方法来防止这种情况。然后您必须在服务器端执行此操作。客户端上发生的一切都是可操作的。 一种方法是使用php或其他服务器端脚本进行ajax调用并测量时间。在服务器端计算时间 客户端用户不能再这样做了(至少他们不能这样做)我会让web应用程序将心跳或任何其他形式的信号发送回服务器端。然后您可以构造一些度量,如duration=end-s

我正在开发一个web应用程序,它必须测量用户做某事所需的时间。我不能简单地使用javascript时间对象,因为用户可能会更改系统时间来欺骗和愚弄应用程序。我需要一些方法来防止这种情况。

然后您必须在服务器端执行此操作。客户端上发生的一切都是可操作的。

一种方法是使用php或其他服务器端脚本进行ajax调用并测量时间。

在服务器端计算时间


客户端用户不能再这样做了(至少他们不能这样做)

我会让web应用程序将心跳或任何其他形式的信号发送回服务器端。然后您可以构造一些度量,如
duration=end-start

考虑到往返的客户机-服务器通信,这显然不适合ms分辨率测量


注意:将时间从一个“受信任”的web服务读入客户端应用程序不是一个好主意,你不能保证应用程序不会对它产生影响。(客户端交易的主要规则之一是不信任其输入,例如,对于验证,您仍然需要在顶部进行服务器端验证)。但是,如果您只是向服务器发送信号,使用服务器的时钟记录其时间戳,您会安全得多。

这在很大程度上取决于您需要的时间测量精度

如果您测量的时间很长(一分钟或更长),并且只需要精确到一分钟以内,那么使用ajax调用获取远程服务器时间显然比任何客户端时钟测量更简单

如果您试图在一分钟内测量更短的时间,那么您需要使用本地时钟来达到任何精度。为此,您可以使用以下类型的算法检查本地计算机的时钟是否受到干扰:

  • 向服务器发送远程请求以获取当前时间。这可以是公开可用的时间资源,也可以是您自己的服务器
  • 获取本地计算机上的当前时间
  • 计算这两次之间的偏移量。您要寻找的是偏移量没有显著变化
  • 使用本地计算机时间,标记本地操作的开始
  • 用户执行他们的操作
  • 获取本地计算机上的当前时间,以标记本地操作的结束
  • 再次获取远程时间
  • 获取本地计算机上的当前时间
  • 计算本地时间和服务器时间之间的偏移量。考虑到检索远程时间所需的时间量存在微小差异,请查看该差异是否与先前计算的差异相对相同。如果这个差异不一样,那么本地时钟就被弄乱了
  • 请注意,由于您无法即时获取远程时间(检索时始终存在不确定的延迟时间),因此在验证本地时钟是否未被干扰时,存在几秒钟的固有不准确度。误差不在于测量本地操作,而在于验证本地时钟没有受到干扰


    所以。。。这项技术最适用于检测超过几秒钟的时钟操作,而不是更小的操作。

    可能有一个提供准确时间的公开web服务,但如果用户更改其区域设置,它仍然可能被欺骗。严肃的问题是,这不就是在开玩笑吗?如何防止客户端在任意时间发送“全部完成”?@ultranaut yes。。。但您可以检查服务器时间,以确保允许他们发送data@ultranaut:我可以从服务器获取开始和结束时间来防止这种情况。@Neal不确定检查以确保允许他们发送数据是什么意思。如果我是客户机,而任务实际上需要两秒钟,那么如何防止我在一秒钟内发送数据呢。服务器将如何确定时间是否合法?当然,除非客户机返回某种答案或证明他们已经完成了任务。