Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止用户伪造表单数据_C#_Model View Controller_Session Variables - Fatal编程技术网

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

C# 如何防止用户伪造表单数据,c#,model-view-controller,session-variables,C#,Model View Controller,Session Variables,我正在开发一个C#MVC应用程序,用户将应用程序提交给管理用户进行审查。管理用户可以批准或拒绝应用程序。“我的管理员主页”呈现提交的应用程序列表,单击每个应用程序将打开一个处理应用程序的新页面 我的担心很简单:由于每个应用程序的“Id”属性是admin“Process application”表单上的一个隐藏html元素,因此用户可能会修改应用程序Id并提交表单(从而批准/拒绝不适当的应用程序)。我可以通过为“AppId”使用会话对象并验证表单发布的AppId是否与会话AppId相同来解决这个问

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

我的担心很简单:由于每个应用程序的“Id”属性是admin“Process application”表单上的一个隐藏html元素,因此用户可能会修改应用程序Id并提交表单(从而批准/拒绝不适当的应用程序)。我可以通过为“AppId”使用会话对象并验证表单发布的AppId是否与会话AppId相同来解决这个问题

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

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

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


PS:我意识到这个问题类似于。然而,我认为最大的区别是,我目前允许用户一次处理多个应用程序,这使得我无法为“AppId”使用单个会话对象。

我将从“健全和安全”的角度来处理这个问题。用户应该只能更改他们应该更改的内容,数据应该[也]在服务器端进行验证,然后您可以忽略所有伪造:-)

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

我同意。我决定在页面加载时检查会话对象,以确保AppId尚未在会话中。如果会话中有AppId,我将重定向用户以使用适当的警告消息处理该应用程序。基本上,一次只能处理一份申请,以防止伪造表格内容。不必要的限制和复杂性。检查他们是否应该编辑ID,验证输入,然后允许它。不需要缓存任何东西,如果用户只能伪造他们可以使用UI进行的编辑,为什么他们要伪造任何东西?如果他们有权编辑它,并且数据是正确的,你为什么要关心它是否是伪造的呢?但是用户不应该能够通过UI编辑应用程序ID。我只需要它在表单上保持,这样我就知道在回发时编辑哪个应用程序。使用会话似乎可以缓解这种情况。“如果用户有权编辑它,并且数据是正确的,那么您为什么要关心它是否是伪造的?”用户有权编辑除应用程序ID之外的所有内容,因为编辑会导致编辑影响不同的应用程序。我假设appid是主键,所以如果他们伪造它,他们就会编辑另一张唱片。如果它不是主键,就不需要缓存它…不向用户传递机密?为什么不在URL中或作为cookie向用户传递会话的唯一标识符,并将所有数据安全地保存在服务器上?通过这种方式,他们没有任何可以编辑/破坏/黑客的东西。经过进一步考虑,我认为@Miloslav Raus有一个很好的观点。我担心的是管理员用户恶意伪造数据,但管理员有能力直接编辑任何可能伪造的记录。有人可能只是为了把事情搞得一团糟而想把数据搞砸,这才成为我项目中的一个关注点。我同意他的方法可能更合适。我只是想用一个简单的解决方案来回答“如何防止用户伪造表单数据”的问题:存储会话中引用的数据的ID,并且只允许用户一次编辑一个表单。会话、数据库、键值存储(即服务器端)。或者在客户端对要保护的数据进行签名/加密。但是,对于允许用户正常进行的更改,没有任何保护措施。