【问题标题】:Quiz application in .NET MVC/JS/JQUERY, how to prevent cheating?.NET MVC/JS/JQUERY 中的测验应用程序,如何防止作弊?
【发布时间】:2018-02-11 11:00:09
【问题描述】:

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

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

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

我正在考虑获取加载问题的确切时间 + 回答时间。如果不是在 10 秒内,他就是在作弊。这会起作用吗,还是有更好更简单的方法来做到这一点?

谢谢。

【问题讨论】:

  • 使用防伪令牌来防止脚本编写。如果 ASP.Net MVC 框架中的内置模块不能满足您的需求,那么您必须创建自己的。
  • @Ashley,我的理解是 Anti Forgery 令牌可以防止跨站点脚本,但我不清楚如何防止黑客使用检查工具篡改 DOM,例如替换事件处理程序并解除绑定旧的。你提到的似乎有道理。将敏感逻辑移至服务器端,在那里选择下一个问题并跟踪防止作弊的时间。
  • @derloopkat 是的,我也有同样的问题。由于两个答案都使用 Anti Forgery 令牌提供了结果,它们是否可以防止使用检查工具等篡改代码?

标签: javascript c# jquery ajax asp.net-mvc


【解决方案1】:

结论:由于无法在客户端阻止任何事情,唯一听起来不错的解决方案是让服务器检查所有内容。

一个 GET 请求,它请求问题并记录时间。之后,一个 JS 计时器,如果倒计时完成,它会自动提交问题。用户也可以手动提交答案(显然)。 POST 答案,服务器记录它的时间,将其与 GET 请求的初始时间进行比较。如果超过 10 秒,则抛出错误,不计算答案。

谢谢大家。

【讨论】:

    【解决方案2】:

    编辑

    我认为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。这意味着即使 如果攻击者设法以某种方式获取有效令牌,他们 不能在应用程序的其他部分重用它 盐值是必需的。

    您可以为不同的用户创建不同的salts,例如this

    编辑

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

    在客户端

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

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

    在服务器端(验证令牌)

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

    2- 如果验证成功,则允许继续请求。如果验证失败,框架会抛出一个HttpAntiForgeryException

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

    【讨论】:

    • @Ashley 我在答案中添加了编辑部分,以解释为什么它可以防止使用检查工具篡改代码。请看这个。
    • 这与问题无关。
    • @StephenMuecke 感谢您的评论。我编辑了我的答案。谢谢你告诉我编辑过的答案。
    • 我从未要求提供特定的客户端解决方案。即使在我的原始帖子中,我通过提交初始页面加载的时间并在用户提交答案时提交它来描述服务器端解决方案。我仍然不知道是否有任何其他解决方案,或者这个解决方案是否可行,因为我不知道如何发布这两个 DateTime 而不让它们能够篡改。
    猜你喜欢
    • 2013-10-27
    • 1970-01-01
    • 2020-09-09
    • 2019-06-22
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多