javascript不可压缩倒计时计时器

4dc9hkyq  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(236)

我目前正在开发一个测验应用程序。当一个问题出现时,用户有10秒的时间来回答,否则他们不会得到该问题的分数。一旦计时器启动,我想自动转到下一个问题。我目前面临的问题是如何使10秒倒计时计时器“不可压缩”的客户端。
我最初的想法是按照 setTimeout() 在客户端等待10秒钟,计时器完成后,让服务器获取下一个问题。问题是,客户端计时器可能会被黑客攻击/修改,运行时间超过10秒,可能会让一些用户回答问题的时间超过10秒。

client <--- sends question --- server
  |
start timer for 10 seconds (as this is client-side, it could easily be extended)
  |
  .
10 seconds later 
  .
  V
client --- ask for next question / send answer ---> server

为了使它不可修改,我考虑将时间检查逻辑移到服务器端。这需要保留两个变量( AB )在服务器端,每个连接的用户,一个表示发送问题的时间,另一个表示给出答案的时间。客户端计时器仍将运行,但服务器端使用时间戳执行一些验证,以检查时间戳a和b之间的差异是否超过10秒:

client <--- sends question --- server (send question at timestamp `A`)
  |
start timer for 10 seconds (as this is client-side, it could easily be extended)
  |
  .
10 seconds later 
  .
  V
client --- ask for next question / send answer ---> server (receive request at timestamp `B`)
                                                      |
+-----------------------------------------------------+
v
server logic:
  duration = B - A
  if(duration > 10 seconds) {
    // allocated time exceeded
  }

然而,我看到了一些潜在的缺陷。问题从服务器到达客户端所需的时间,以及服务器发送问题的时间(时间) A )客户端计时器启动的时间不是指令性的,取决于用户与服务器的ping/连接。当客户端询问下一个问题时,也存在类似的ping问题。此外,我担心如果本应运行10秒的客户端计时器落后一点,那么它也会导致服务器端检查失败。因此,检查持续时间是否超过10秒是不够的,还需要一些额外的缓冲区。然而,我觉得将缓冲区任意硬编码为1秒或2秒可能仍然会导致问题,并且感觉像是一个不太健壮的黑客工作。
问:我想知道是否有一个不同的方法,我错过了保持客户端定时器不可压缩和准确。我还想尽量避免创建单独的计时器 setTimeout() 或者对于服务器端的每个已连接用户都是一样的,因为在一个给定的时间点上可以连接许多用户,而让这么多的计时器在服务器上排队感觉没有资源。我还希望尽量减少客户端和服务器之间来回发送的消息数量。

ppcbkaq5

ppcbkaq51#

来块饼干怎么样?
设置具有唯一令牌的cookie。将其过期时间设置为now()+15秒。在服务器端保存令牌和时间。保持客户端计时器运行,10秒后自动提交。
当答案出现时,如果没有饼干。。。这当然意味着答案是在延迟之后发送的(而且计时器被黑了)。
因此,cookie过期时间now()+10秒+5秒的宽限期应该足以补偿http延迟。
如果他们破解了计时器,cookie应该已经过期(并被删除)。如果他们也破解了cookie过期(!),无论如何,令牌将用于检索问题sent datetime,您将其与答案received datetime进行比较。

5jdjgkvh

5jdjgkvh2#

而不是在发送问题时启动服务器上的时钟。当问题显示给用户(在客户端)时,您可以在服务器上启动时钟。
保持两个时钟,一个在客户机上,另一个在服务器上。
每个时间敏感请求的时间戳( Start quiz timerEnd quiz timer 并检查时间戳差异是否在可接受的公差范围内。

相关问题