我正在使用C#MVC应用程序,用户向管理用户提交应用程序以供审核。管理用户可以批准或拒绝应用程序。我的管理员主页呈现提交的应用程序列表,单击每个应用程序将打开一个处理应用程序的新页面。
我的担心很简单:因为" Id"每个应用程序的属性是admin" Process Application"上的隐藏html元素。表单,用户可能会修改应用程序ID并提交表单(反过来批准/拒绝不适当的应用程序)。我可以通过使用Session对象来解决这个问题,因为#34; AppId"并验证表单发布的AppId与会话AppId相同。
然而(这是真正的问题),如果我设置Session [" AppId"] = applicationId,如果用户在提交之前试图处理另一个应用程序,则可以轻松覆盖会话对象首先。也许管理员用户喜欢他们自己的多任务,并打开两个"流程应用程序"视窗。基本上,第一个会话[" AppId"]将被第二个会议覆盖。这会导致回发问题,因为现在我无法根据会话验证任何内容。
在写这篇文章时,我意识到我可以添加控件以防止用户同时处理多个应用程序。有没有替代方法?另外值得注意的是,只有管理员用户才能伪造应用程序ID,这不太可能,因为Web应用程序旨在帮助管理员用户。真的,我只是在寻找这些场景的最佳实践,而不是害怕有人会在我的表单上伪造元素。
我的最佳方法是在会话中实际存储AppId,并阻止管理员一次处理多个应用程序(以便不覆盖会话对象)?看起来似乎如此,但我喜欢社区的建议。
PS:我发现这个问题类似于Secure way to stop users from forging forms。但是,我认为最大的区别是我目前允许用户一次处理多个应用程序,这使我无法使用单个会话对象进行“AppId”。
答案 0 :(得分:2)
我从理智和"安全"观点看法。用户应该只能更改他们应该更改的内容,数据应该[也]在服务器端进行验证,然后您可以忽略所有伪造: - )
答案 1 :(得分:1)
我发现的最佳方法是在页面加载时检查AppId会话对象。如果它存在,那么用户没有完成原始应用程序的处理(该场景可以通过各种方式处理。我会让你决定什么是最好的,但你可能会重新定向用户以使用适当的方式处理原始应用程序警告信息解释发生了什么)。这是我能想到的唯一方法,可以防止使用单个会话对象在表单上伪造AppId。