【问题标题】:How to prevent users from cheating by adding extra seconds to a counter in JS?如何通过在 JS 中为计数器添加额外的秒数来防止用户作弊?
【发布时间】:2022-01-15 12:19:18
【问题描述】:

我正在为一个考试网站创建一个 JS 计数器,我发现他们可以通过运行 sec += 10000 在控制台中非常轻松地添加额外的时间,我该如何阻止它。

我在后端使用 laravel

runCounter();
function runCounter() {
  let min = 45;
  let sec = min * 60;
  let x = setInterval(function() {
    console.log(secFormat(sec))
    sec -= 1;

    if (sec <= 0) {
      endExam();
      clearInterval(x);
    }
  }, 1000);
}


function secFormat(x) {
  x = Number(x);
  let h = Math.floor(x / 3600);
  let m = Math.floor(x % 3600 / 60);
  let s = Math.floor(x % 3600 % 60);
  m += h * 60;
  if (m < 10) {
    m = "0" + m
  }
  if (s < 10) {
    s = "0" + s
  }
  return m + ":" + s;
}

function endExam() {
  alert('exma ended');
}

【问题讨论】:

  • 您无法阻止用户在他们的浏览器中显示他们想要的任何内容。
  • 在线编程的基本规则:假设用户会尝试作弊。所有重要的事情都必须由服务器处理
  • 您必须解释为什么它在您的情况下不起作用。任何阻止用户修改在他们的机器上执行的 JavaScript 的尝试只会导致人们需要弄清楚如何绕过你的尝试
  • @UnholySheep 是正确的。你无法保护客户。从安全角度来看,客户端已经受到威胁。您唯一可以信任的就是服务器。

标签: javascript laravel


【解决方案1】:

将你的函数放入下面的自执行函数中

 (function runCounter() {   
   let min = 45;   
   let sec = min * 60;  
 
   let x = setInterval(function() {
        console.log(secFormat(sec))
        sec -= 1;
    
        if (sec <= 0) {
          endExam();
          clearInterval(x);
        }   }, 1000); }
    )();

所以它的变量对外部环境来说是私有的,即控制台

【讨论】:

  • 这个答案与我在比你早两分钟发布的更详尽的答案中分享的想法有什么不同?
  • 完全一样的伴侣。我只是用他自己的代码详细说明,
  • 好的,所以基本上这个答案旨在用提问者自己的代码来说明它。明白了。
【解决方案2】:

简单:在您的 Laravel 项目中,您存储用户开始考试的时间,并创建一个 cron 作业,该作业将定期运行并检查是否有任何考试时间已过。如果是这样,则将该考试视为失败,因为用户未能及时发送答案。

您不必担心用户如何更改 JS 代码,因为如果服务器知道考试何时开始,那么学生或浏览器声称的内容无关紧要。

您的主要问题是您的网站假定用户的浏览器具有准确的信息。但是用户可以随意更改JS代码。

您可以通过在所有 Javascript 周围包装一个函数来让用户更难使用,例如

function() {
    //your JS code
}();

在这种情况下,至少您的函数不会在全局上下文中。但这也可能被黑客入侵。

让我解释一下为什么你不能以任何方式阻止这种情况发生:

  • 您可以创建一个与您网站上的 HTML、JS 相同的小项目
  • 添加将用作代理的本地服务器
  • 而用户的时间只是一个常数

更简单:用户可以在考虑解决方案的同时在 Javascript 代码的某处放置一个断点,这样他/她的时间就永远不会过去。

永远不要相信用户数据。

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2013-11-08
    • 2019-06-20
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多