在线测验使用JavaScript?

6
也许这是一个新手问题,但我真的很困惑。 我正在尝试制作一个在线测验,在其中用户必须在4个可能的答案之间进行选择。但我卡住了,因为有1个问题确实困扰着我。
我有一个JavaScript函数,当用户点击错误答案时,它会更改按钮的背景颜色并使其无效。正确答案按钮(提交)调用不存在的函数,只是为了混淆人们,如果他们决定快速查看源代码。一切都进行得很顺利,但然后我开始思考。如果用户决定更深入地查看我的源代码怎么办?他将能够看到我的JavaScript函数,可能能够在不真正玩游戏的情况下弄清楚正确的答案。
是否有任何方法可以隐藏源代码(据我所知,使用JavaScript不可能),但也许我可以使用其他东西?其他开发者在这些情况下使用什么?有建议吗? :)

4
一切都很顺利,但我开始思考——这是个大错误。 - Michael Krelin - hacker
这就是网络的本质。你可以混淆代码(不建议),或者压缩代码。 - elclanrs
6
如果你想防止人们看到正确答案,这些答案不能作为嵌入式源代码的一部分。因此,所有验证和检查都需要通过异步 AJAX 回调(或类似“安全”的方式)在服务器端处理。 - zzzzBov
2
这里有很多细节:https://dev59.com/hWw15IYBdhLWcg3wCnQn#6869371 - Daniel F. Thornton
可能是使用JavaScript检查测验答案的最安全方法的重复问题。还相关的:javascript安全问题,关于游戏时间 - Bergi
4个回答

6

如果您想确保安全,您需要在服务器端执行(例如,使用PHP)。为了让作弊者更难实施欺骗行为,您可以使用各种JS混淆器之一来混淆您的JavaScript代码,比如这个,然而这并不能提供完全的安全性。


混淆(IMO)保护的是逻辑而不是数据本身...尽管如此,它确实是一个更多的障碍,让狡猾的用户去克服 - 在这个意义上,有助于OP。+1 - Lix
谢谢!我认为这就可以了。 - destripet

5
用户可以作弊的原因是答案在JavaScript代码中。
解决方案:不要将答案放在JavaScript代码中,而是保留在服务器上。
类似这样:每当用户更改对问题的答案时...
  1. JavaScript向服务器发送答案。
  2. 服务器以“是”或“否”的形式回复。
  3. JavaScript显示回复给用户。
用户永远看不到答案,只能知道它是真还是假。 简而言之,学习AJAX。

2

这是一个很好的问题,每个Web开发人员都应该问自己...

这是我们作为Web开发人员每天面临的一个主要问题。我们的JavaScript是可见的,有时甚至可以被编辑。不要相信来自客户端的任何内容!

我通常做的是:

  1. 在服务器上生成某种唯一哈希。
  2. 将此哈希嵌入HTML和JavaScript中。
  3. 随着任何请求一起发送此哈希。
  4. 通过重新创建哈希并确保与发送的哈希匹配来验证服务器上的哈希。

哈希可以是项目ID、会话ID、一些盐以及您可以重构以验证请求的任何其他可识别数据的连接。


什么?任何生成哈希的JavaScript都可以被客户端操纵。从安全角度来看,你从客户端获取的任何验证哈希值都是无用的。 - Anko
@aku - 这不是我想表达的意思。哈希值是在服务器上生成的,嵌入到JS中并发送回服务器进行验证。我已经编辑了我的答案,更加强调了这个过程。感谢您的反馈! - Lix

0
为了补充其他答案,提供学习如何设置服务器可能需要几天的成本,我将为您提供一个5分钟快捷指南,教您如何设置一个简单的node.js服务器来隐藏您的答案。
安装node.js。
创建一个名为server.js的文件,并将以下内容复制到其中。
var express = require("express"),
    app = express();
app.get("first_answer",function(req,res){
   res.send("b");
});
app.listen(8080);

打开终端,输入

npm install express
cd path_to_the_folder_you_placed_the_file
node server.js

这将安装express.js模块并运行服务器。

现在,在您的网站上,使用jQuery,只需从服务器请求答案。使用jQuery的示例:

var user_answer = ...
$.get("http://localhost:8080/first_answer",function(answer){
    if (answer == user_answer)
        alert("you got it right!");
});

如果想了解更复杂的示例和最佳的服务器使用方法,可以阅读 express.js 的文档。(;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接