什么比ASP.NET MVC中的隐藏表单字段更安全?

时间:2009-04-13 04:55:48

标签: asp.net-mvc

在ASP.NET MVC(默认路由)中,我想使用这样的URL来返回带有表单的View来编辑客户:

/Customers/Edit/5

我需要使用CustomerId=5,但我不想让客户更改它。现在我使用隐藏ID:

<%= Html.Hidden("CustomerId") %>

这实现了我想要的,但我的印象是隐藏的表单变量不安全,可以被最终用户操纵。

那么,允许客户编辑信息而不是他们的ID的最佳方式是什么?

6 个答案:

答案 0 :(得分:10)

在显示相应视图之前,检查控制器操作(/ Customers / Edit)中的权限。请注意,此处的问题根本不在于您的隐藏字段:用户只需在其浏览器中输入“http://yoursite.com/Customers/Edit/10”即可。因此,无论他如何调用该操作,您都必须检查您的操作是否真的允许用户编辑所请求客户的详细信息。

答案 1 :(得分:6)

您在浏览器端没有任何真正的安全性。您可以将客户ID放在查询字符串中,但服务器应验证是否真的允许他们编辑该客户。如果没有,请返回错误。

答案 2 :(得分:3)

我遇到了同样的问题,我相信解决方案涉及使用代理键。在我有ID列的每个表中,我还添加了一个Guid(SQL服务器中的uniqueidentifier)的Key列。现在,在进行连接或任何内部逻辑时,我使用ID但控制器都使用密钥。由于它是一个Guid,很难猜出另一个记录的Guid是什么。

或者(或者除了上述内容之外),您可以根据This article加密隐藏字段

答案 3 :(得分:3)

防篡改隐藏字段一切都很好但是通过默默无闻仍然是安全的。最好通过保护控制器和操作来保护网站,更具体地说是MVC。然后,用户可以篡改他们想要的所有东西,而且他们不会到达任何地方。

答案 4 :(得分:1)

有两个方面。我不确定你直接询问的是什么,但它们都很重要:

  • 对于任何给定用户,可能不允许他们编辑所有客户。因此,正如Dmitry建议的那样,您对表单帖子的控制器操作需要查看他们正在尝试编辑的客户,并验证是否确实允许登录用户编辑该客户。您可能还希望在首先生成编辑表单的控制器操作中执行类似检查,如果不允许他们编辑所请求的客户,则甚至不允许他们访问表单。
  • 对于给定用户和给定客户,您可能不希望用户能够更改客户ID。如果在POST控制器操作中使用UpdateModel方法,则需要使用属性whitelist参数并排除ID属性,以便用户不更改ID。即使他们更改隐藏字段的值,UpdateModel也会通过白名单忽略更改的值。

答案 5 :(得分:0)

我也有同样的担忧,我的解决方案是使用加密。 您可以在服务器端加密CustomerId值,然后将其作为查询字符串或隐藏字段发送,以便用户无法更改它,并且可以在需要时将其解密

相关问题