我正在制作一个测验应用程序,其中 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
is just an arbitrary string. A different salt value means a differentanti-forgery token
will be generated. This means that even if an attacker manages to get hold of a valid token somehow, they can’t reuse it in other parts of the application where a different salt value is required.
您可以为不同的用户创建不同的salt
,例如 this .
编辑
AntiForgeryToken()
使用如下检查工具防止篡改代码:
在客户端
1- 将生成一个新的随机 anti-XSRF
token 。
2- 使用步骤 (1) 中的安全 token 生成反 XSRF 字段 token 。
在服务器端(验证 token )
1- 读取传入 session token 和字段 token ,并从每个 token 中提取 anti-XSRF
token 。生成例程中的每个步骤(2 个客户端)的 anti-XSRF
token 必须相同。
2- 如果验证成功,则允许请求继续进行。如果验证失败,框架将抛出 HttpAntiForgeryException
。
有关更多信息,请参阅 this article 。
关于javascript - .NET MVC/JS/JQUERY中的问答应用,如何防止作弊?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46016157/