我有一个打字测试的网站。用户可以在登录后进行测试。在测试结束时,它发送一个ajax并显示结果的准确性,每分钟按键,错误按键等。
我注意到有人在我的网站上创建了一个帐户,并且他总是以每分钟2000或更多的密钥获得最高分。我发现只做一件事就是ajax。 任何人都可以使用像这样的新值 -
从控制台面板运行ajax$.ajax({ // this is the main code we have to prevent
type: 'POST',
url: '/typingtest',
//dataType: 'json',
data:{
"corrects":2000,
"incorrects":0,
"netwpm" : 2000,
"FixedMistakes" : 0,
"TotalEntries" : 20000,
"ErrorRate" : 0,
"RawSpeed" : 50000,
"KeySpeed" : 50000,
"CompleteWords" : 2000,
"TotalTime" : 1,
"accuracy" : 200,
"ajaxSubmit" : "ajaxSubmit"
},
success: function(data) {
window.location.href = data;
},
complete: function() {
// Schedule the next request when the current one's complete
}
});
他会得到这个结果 -
我已尝试使用某个标志变量在ajax页面上进行验证。但是使用js完成的任何事情仍然可以让任何人看到并轻松调试此过程以更改值。最后他可以运行ajax。
有没有人想要防止这件事发生?
答案 0 :(得分:1)
对于每分钟的单词,我建议:
在开始测试之前,请确保您的服务器端代码知道测试中有多少字。最好确保每次都有点随机。
当用户启动测试时向服务器发送请求,以获取测试开始时间的时间戳。
在测试期间,计算成功完成的单词数量。
然后在测试结束时再次发送成功完成的单词数以获得总的经过时间。与服务器确认已完成单词的数量与最初给出的原始单词数相同,以确保没有人篡改该数字。
这样,客户端无法跟踪任何无法验证的信息。
准确性有点难以验证,但只需确保设置最大值(准确度为200%绝对不可能!)。
此外,您可以通过模糊处理来尝试安全性(请参阅How can I obfuscate (protect) JavaScript?),但这不是最安全的方法,因为经验JavaScripters仍然可以知道发生了什么。