如何防止用户伪造表单数据

How to prevent users from forging form data

我正在开发一个 C# MVC 应用程序,用户可以在其中将应用程序提交给管理用户进行审查。管理用户可以批准或拒绝申请。我的管理员主页呈现已提交申请的列表,单击每个申请会打开一个处理申请的新页面。

我的担心很简单:由于每个应用程序的 "Id" 属性是管理 "Process Application" 表单上的隐藏 html 元素,因此用户可能会修改应用程序ID 并提交表格(反过来 approving/denying 不适当的应用程序)。我可以通过为 "AppId" 使用 Session 对象并验证表单发布的 AppId 与会话 AppId 相同来解决这个问题。

但是(这是真正的问题),如果我设置 Session["AppId"] = applicationId,如果用户在提交之前尝试处理另一个应用程序,那么会话对象可以很容易地被覆盖第一的。也许管理员用户认为自己是一个多任务处理者并打开两个 "Process Application" windows。本质上,第一个 Session["AppId"] 将被第二个覆盖。这会导致回发出现问题,因为现在我无法验证基于会话的任何内容。

在写这篇文章时,我意识到我可以添加控件来防止用户同时处理多个应用程序。有替代方法吗?同样值得注意的是,只有管理员用户才能伪造应用程序 ID,这不太可能,因为 Web 应用程序旨在帮助管理员用户。实际上,我只是在为这些场景寻找最佳实践,而不是担心有人会在我的表单上伪造元素。

我最好的方法实际上是在会话中存储一个 AppId,并防止管理员一次处理多个应用程序(这样会话对象就不会被覆盖)?看起来是这样,但我希望得到社区的建议。

PS:我意识到这个问题类似于Secure way to stop users from forging forms。但是,我认为最大的区别是我目前允许用户一次处理多个应用程序,这阻止了我为“AppId”使用单个会话对象。

我会从 "sanity & security" 的角度来处理这个问题。用户应该只能更改他们应该更改的内容,数据应该 [also] 在服务器端进行验证,然后您可以忽略所有伪造:-)

我发现的最佳方法是在页面加载时检查 AppId 会话对象。如果它存在,那么用户没有完成处理原始应用程序(这种情况可以通过多种方式处理。我会让你决定什么是最好的,但你可以使用适当的方法将用户重定向回处理原始应用程序解释所发生情况的警告消息)。这是我能想到的防止使用单个会话对象在表单上伪造 AppId 的唯一方法。