我正在开发一个必须测量用户需要做某事的时间的网络应用程序。我不能简单地使用 javascript time 对象,因为用户可能会更改系统时间来欺骗和欺骗应用程序。我需要一些方法来防止这种情况。
4 回答
在服务器端计算时间。
客户端用户不能这样做(至少他们不应该这样做)
我会让网络应用程序将心跳或任何其他形式的信号发送回服务器端。然后你可以构建一些指标,比如duration = end - start
考虑到往返客户端-服务器通信,这显然不适合 ms 分辨率测量。
注意:将时间从“受信任的”Web 服务读取到您的客户端应用程序中并不是一个好主意,您不能真正保证应用程序不会对其进行调整。(客户端交易的基本规则之一是不信任其输入,例如,对于验证,您仍然需要在顶部进行服务器端验证)。但是,如果您只是向服务器发送信号,使用服务器的时钟记录其时间戳,您会更安全。
然后你必须在服务器端进行。客户端上发生的一切都是可操作的。
一种方法是进行 ajax 调用并在 php 或其他服务器端脚本中测量时间。
这在很大程度上取决于您需要什么时间测量精度。
如果您要测量很长时间(一分钟或更长时间)并且只需要在一分钟内精确,那么使用 ajax 调用来获取远程服务器时间显然是比任何客户端时钟测量更简单的方法。
如果您想在一分钟内测量更短的时间,那么您将需要使用本地时钟来达到任何精度。为此,您可以使用以下类型算法检查本地计算机的时钟是否被弄乱:
- 向服务器发送远程请求以获取当前时间。这可以是公开可用的时间资源,也可以是您自己的服务器。
- 获取本地计算机上的当前时间。
- 计算这两次之间的偏移量。您正在寻找的是偏移量没有显着变化。
- 使用本地计算机时间,标记本地操作的开始
- 用户执行他们的操作。
- 获取本地计算机上的当前时间以标记本地操作的结束
- 再次获得远程时间。
- 获取本地计算机上的当前时间
- 计算本地时间和服务器时间之间的偏移量。允许检索远程时间所花费的时间量有微小差异,看看该差异是否与先前计算的差异相对相同。如果这个差异不一样,那么本地时钟已经被弄乱了。
请注意,因为您无法立即获得远程时间(检索它时总是存在不确定的延迟时间),因此在验证本地时钟是否没有被打乱时存在几秒钟的内在误差。不准确之处不在于测量本地操作,而在于验证本地时钟没有被弄乱。
所以......这种技术最适合检测超过几秒的时钟操作,而不是更小的操作。