我正在做一个测验应用程序,其中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。