从控制台阻止js攻击

时间:2014-03-13 06:15:07

标签: javascript jquery ajax

我有一个打字测试的网站。用户可以在登录后进行测试。在测试结束时,它发送一个ajax并显示结果的准确性,每分钟按键,错误按键等。

enter image description here

我注意到有人在我的网站上创建了一个帐户,并且他总是以每分钟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
 }
});

他会得到这个结果 -

enter image description here

我已尝试使用某个标志变量在ajax页面上进行验证。但是使用js完成的任何事情仍然可以让任何人看到并轻松调试此过程以更改值。最后他可以运行ajax。

有没有人想要防止这件事发生?

1 个答案:

答案 0 :(得分:1)

对于每分钟的单词,我建议:

在开始测试之前,请确保您的服务器端代码知道测试中有多少字。最好确保每次都有点随机。

当用户启动测试时向服务器发送请求,以获取测试开始时间的时间戳。

在测试期间,计算成功完成的单词数量。

然后在测试结束时再次发送成功完成的单词数以获得总的经过时间。与服务器确认已完成单词的数量与最初给出的原始单词数相同,以确保没有人篡改该数字。

这样,客户端无法跟踪任何无法验证的信息。


准确性有点难以验证,但只需确保设置最大值(准确度为200%绝对不可能!)。


此外,您可以通过模糊处理来尝试安全性(请参阅How can I obfuscate (protect) JavaScript?),但这不是最安全的方法,因为经验JavaScripters仍然可以知道发生了什么。