我正在制作测验应用程序,其中有4个用户加入大厅(完成),然后领导者开始测验。
启动测验时,问题就会随机选择。用户可以回答它们,然后单击提交。每个问题是定时的,这意味着用户只有10秒钟可以回答这个问题。
这一切都是通过Ajax完成的,因为我希望该网站是实时的。我如何防止作弊?用户可以手动编辑JS文件,等等
我正在考虑获得问题加载 答案时间的确切时间。如果不在10秒的时间内,他就在作弊。那会起作用,还是有更好,更轻松的方法来做到这一点?
谢谢。
edit
我认为AntiForgeryToken
是解决您的问题的正确解决方案。我读了很多文章,以确保我的旧答案正确。
1-隐藏或加密JavaScript源代码
2-如何在编程中禁用HTML查看源或加密HTML元素?
3-如何证明客户端JavaScript是安全的?
4- ASP.NET MVC-抗验性用户是否阻止用户更改发布的形式值?
我得出结论:
AntiForgeryToken
阻止恶意网站欺骗用户到看起来与原件相同的表单并将其发布到原始站点。它不能阻止您描述的情况。
确实没有办法完全做到这一点。如果该人有有效的Auth Cookie,则他们可以制作任何想要的请求,而不管页面上的代码如何,并将其发送到您的服务器。
您可以使用htmlhelper.antiforgerytightertergerytigent含盐价值。
使用这些帮助者保护特定表格,将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
。
编辑
AntiForgeryToken()
使用这样的检查工具防止对代码进行篡改:
在客户端
1-将生成新的随机anti-XSRF
令牌。
2-使用步骤(1)的安全令牌生成抗XSRF字段令牌。
在服务器端(验证令牌)
1-读取传入的会话令牌和字段令牌,并从每个方面提取anti-XSRF
令牌。anti-XSRF
代币必须在一代例程中每个步骤(2个客户端)相同。
2-如果验证成功,则允许该请求继续进行。如果验证失败,则框架将抛出HttpAntiForgeryException
。
有关更多信息,请参阅本文。
结论:由于无法防止客户端的任何内容,因此听起来确实可以的唯一解决方案是让服务器检查所有内容。
get请求,请求问题并记录时间。之后,如果倒计时完成,则自动提交问题的JS计时器。用户还可以手动提交答案(显然)。答案的帖子和服务器记录了时间的时间,将其与获取请求的初始时间进行比较。如果超过10秒钟,则会引发和错误,并且不计数答案。
谢谢大家。