在ASP.NET MVC(默认路由)中,我想使用这样的URL来返回带有表单的View来编辑客户:
/Customers/Edit/5
我需要使用CustomerId=5
,但我不想让客户更改它。现在我使用隐藏ID:
<%= Html.Hidden("CustomerId") %>
这实现了我想要的,但我的印象是隐藏的表单变量不安全,可以被最终用户操纵。
那么,允许客户编辑信息而不是他们的ID的最佳方式是什么?
答案 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)
有两个方面。我不确定你直接询问的是什么,但它们都很重要:
答案 5 :(得分:0)
我也有同样的担忧,我的解决方案是使用加密。 您可以在服务器端加密CustomerId值,然后将其作为查询字符串或隐藏字段发送,以便用户无法更改它,并且可以在需要时将其解密