使用 JSON 为测验提供答案密钥的干净方法

Clean way to provide answer key to quiz with JSON

提问人:madpixl 提问时间:12/21/2017 更新时间:12/21/2017 访问量:1563

问:

这更多的是关于代码组织和一种可以推广的更流畅的方法。具体来说,它存在于我正在构建的 Jeopardy 测验中,以提高我在 AJAX/JSON 方面的技能。我想把答案与问题分开。只需在 DevTools 中查找并打开 JSON,即可找到正确答案。我想让它更难一点,但不要太难编码或添加超过一两个 JSON 文件的更多层。 (不要像散列数据库查询那样矫枉过正,因为它只是一个宠物项目)。

不知道该怎么做... 这是我的 JSON.. { “question”: “杰斐逊建造蒙蒂塞洛的小镇”, “选择”:[ “里士满”, “Raliegh”, “夏洛茨维尔” ] }

我在 JSON 中的问题得到了正确答案,但我不确定这是最好的方法......我认为 anwser 密钥可能会更好。

JavaScript JSON AJAX 体系结构 客户端

评论


答:

0赞 rafasoares 12/21/2017 #1

我会创建一个端点来获取问题 ID 和所选答案,返回它是否正确和正确答案,以防错误,在此过程中将问题标记为该用户/会话的答案。

这样,即使用户使用 DevTools 或类似的东西访问你的 API,效果也与通过 UI 进行应答相同。

评论

0赞 madpixl 12/22/2017
嗯。起初,当您说端点时,我以为您只是在发送问题 ID 和选定的答案。如果它以 200 回应,那将是正确的。但我根本没有想过提供正确的答案,因为我不想泄露答案,这样别人就可以拿两次。...但是,如果题库变得足够大并且它们是随机的,那么提供正确的答案和解释是有意义的。我会尽你的方式。
0赞 rafasoares 12/22/2017
这就是为什么我提到标记这个人已经回答了这个问题。您提出的问题与用户尝试通过 UI 多次回答问题相同。在我看来,某种会话管理将是处理这个问题的最简单方法。至于是否返回正确答案,这取决于您想要的用户体验。我会这样做,但你也只能证明答案是错误的。我见过采用这两种方法的在线测验。
1赞 Derek Hopper 12/21/2017 #2

一种方法是执行此操作(并保持简单)是对 JSON 对象进行 base64 编码。

首先,一旦你有了所有的问题,就把它们编码为 base64。您可以使用 JavaScript 中的函数来执行此操作。不过,不要将这行代码放在客户端中。btoa

btoa( JSON.stringify({ "question": "Town where Jefferson built Monticello", "choices": [ "Richmond", "Raliegh", "Charlottesville" ] }))

然后,获取该 base64 编码的字符串并将其放在代码中。

const data = "eyJxdWVzdGlvbiI6IlRvd24gd2hlcmUgSmVmZmVyc29uIGJ1aWx0IE1vbnRpY2VsbG8iLCJjaG9pY2VzIjpbIlJpY2htb25kIiwiUmFsaWVnaCIsIkNoYXJsb3R0ZXN2aWxsZSJdfQ=="

从那里,您可以解码并将其转换回代码中的 JSON 对象。

let questions = JSON.parse( atob(data) )

就像您在问题中提到的,这仍然可以被“黑客入侵”。无论如何,这都不是适当的安全性。人们可以检查它并运行代码以获取问题和答案。然而,乍一看,答案并不明显。

为了让它变得更好一点,你可以通过一个混淆工具运行你的 JavaScript。和 的变量会被破坏,并且很难识别正在解码的内容。dataquestions