【发布时间】:2015-10-30 00:13:45
【问题描述】:
我正在开发一个 C# MVC 应用程序,其中用户将应用程序提交给管理用户进行审查。管理用户可以批准或拒绝应用程序。我的管理员主页呈现提交的申请列表,点击每个申请会打开一个处理申请的新页面。
我的担心很简单:由于每个应用程序的“Id”属性是管理“处理应用程序”表单上的隐藏 html 元素,因此用户可能会修改应用程序 ID 并提交表单(反过来批准/拒绝不适当的申请)。我可以通过对“AppId”使用 Session 对象并验证表单发布的 AppId 与会话 AppId 相同来解决此问题。
但是(这是真正的问题),如果我设置 Session["AppId"] = applicationId,如果用户想在提交第一个应用程序之前尝试处理另一个应用程序,那么该会话对象很容易被覆盖。也许管理员用户认为自己是一个多任务处理者并打开两个“处理应用程序”窗口。本质上,第一个 Session["AppId"] 将被第二个覆盖。这会导致回发出现问题,因为现在我无法根据 Session 验证任何内容。
在写这篇文章时,我意识到我可以添加控件来防止用户同时处理多个应用程序。虽然有替代方法吗?同样值得注意的是,只有管理员用户才能伪造应用程序 ID,这不太可能,因为 Web-App 旨在帮助管理员用户。实际上,我只是在为这些场景寻找最佳实践,而不是担心有人会在我的表单上伪造元素。
我最好的方法是在会话中实际存储一个 AppId,并防止管理员一次处理多个应用程序(这样会话对象就不会被覆盖)?看起来是这样,但我喜欢社区的建议。
PS:我意识到这个问题类似于Secure way to stop users from forging forms。但是,我认为最大的不同是我目前允许用户一次处理多个应用程序,这使我无法将单个会话对象用于“AppId”。
【问题讨论】:
-
不向用户传递秘密?为什么不在 URL 中或作为 cookie 向用户传递他们会话的唯一标识符,并将所有数据安全地保存在服务器上?这样他们就没有什么可以编辑/破坏/破解的了。
标签: c# model-view-controller session-variables