我正在制作一个测验应用程序,其中4个用户加入大厅(已完成),然后领导者开始测验。
当测验开始时,随机选择问题。用户可以回答它们,然后单击“提交”。每个问题都是定时的,这意味着用户只有10秒的时间来回答问题。
这一切都是通过AJAX完成的,因为我希望网站是实时的。我究竟该如何防止作弊?用户可以手动编辑JS文件等。
我正在考虑获取问题加载的确切时间+答案时间。如果它不在10秒的时间内,他会作弊。这会有用吗,还是有更好更简单的方法来做到这一点?
谢谢。
答案 0 :(得分:1)
修改强>
我认为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
只是一个任意字符串。不同的盐值意味着a 将生成不同的anti-forgery token
。这意味着即使 如果攻击者设法以某种方式获得有效的令牌,他们 不能在应用程序的其他部分重用它 盐值是必需的。
您可以为this等不同用户创建不同的salts
。
修改强>
AntiForgeryToken()
可以使用以下检查工具防止篡改代码:
在客户端
1-将生成一个新的随机anti-XSRF
令牌。
2-使用步骤(1)中的安全令牌生成反XSRF字段令牌。
在服务器端(验证令牌)
1-读取传入的会话令牌和字段令牌,并从每个令牌中提取anti-XSRF
令牌。生成例程中每个步骤(2个客户端)的anti-XSRF
令牌必须相同。
2-如果验证成功,则允许请求继续。如果验证失败,框架将抛出HttpAntiForgeryException
。
有关详细信息,请参阅 this article 。
答案 1 :(得分:1)
结论:由于客户端无法阻止任何事情,实际上听起来没问题的唯一解决方案是让服务器检查所有内容。
GET请求,它请求问题并记录时间。之后,一个JS计时器,如果倒计时结束,它会自动提交问题。用户也可以手动提交答案(显然)。回答的POST,服务器记录它的时间,将其与GET请求的初始时间进行比较。如果超过10秒,则会抛出错误,并且不会计算答案。
谢谢大家。