我正在做一个测验应用程序,其中4个用户加入一个大厅(完成),然后领导者开始测验。

当测验开始时,将随机选择问题。用户可以回答他们,然后单击提交。每个问题都是定时的,这意味着用户只有10秒的时间来回答问题。

所有这些都是通过AJAX完成的,因为我希望网站是实时的。我到底如何防止作弊?用户可以手动编辑JS文件等。

我正在考虑获取问题加载的确切时间+回答时间。如果不在10秒内,他就在作弊。那行得通,还是有更好,更轻松的方式来做到这一点?

谢谢。

最佳答案

编辑

我认为AntiForgeryToken是解决您的问题的正确解决方案。我阅读了许多文章,以确保我的旧答案正确。

1- Hiding or Encrypting the javascript source code

2- How to Disable HTML view source or Encrypt Html elements programatically?

3- How To Prove That Client Side Javascript Is Secure?

4- ASP.NET MVC - does AntiForgeryToken prevent the user from changing posted form values?

我得出的结论是:

AntiForgeryToken防止恶意站点将用户诱骗到看起来与原始表单相同的表单,并将其发布到原始站点。它不会阻止您描述的方案。

完全没有办法完全在客户端执行此操作。如果此人具有有效的身份验证cookie,则无论页面上的代码是什么,他们都可以编写所需的任何类型的请求,并将其发送到您的服务器。


您可以使用HtmlHelper.AntiForgeryToken with salt value

要使用这些助手来保护特定形式,请将Html.AntiForgeryToken()放入BeginForm中,例如,

@using (Html.BeginForm("Users", "SubmitQuiz"))
{
    @Html.AntiForgeryToken()
    <!-- rest of form goes here -->
}


这将输出如下内容:

<form action="/Users/SubmitQuiz" method="post">
    <input name="__RequestVerificationToken" type="hidden" value="saTFWpkKN0BYazFtN6c4YbZAmsEwG0srqlUqqloi/fVgeV2ciIFVmelvzwRZpArs" />
    <!-- rest of form goes here -->
</form>


接下来,要验证传入的表单发布,请将[ValidateAntiForgeryToken]过滤器添加到目标操作方法。例如,

[ValidateAntiForgeryToken]
public ViewResult SubmitQuiz()
{
    // ... etc
}



  Salt只是一个任意字符串。盐值不同意味着
  将生成不同的anti-forgery token。这意味着,即使
  如果攻击者设法以某种方式获得了有效令牌,他们将
  无法在应用程序的其他部分重复使用
  盐值是必需的。


您可以为不同的用户(如this)创建不同的salts

编辑

AntiForgeryToken()防止使用如下检查工具篡改代码:

在客户端

1-将生成一个新的随机anti-XSRF令牌。

2-使用步骤(1)中的安全令牌生成反XSRF字段令牌。

在服务器端(验证令牌)

1-读取传入的会话令牌和字段令牌,并从每个令牌中提取anti-XSRF令牌。在生成例程中,每个步骤(两个客户端)anti-XSRF令牌必须相同。

2-如果验证成功,则允许请求继续进行。如果验证失败,则框架将抛出​​HttpAntiForgeryException

有关更多信息,请参见this article

07-24 19:56