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

roy*_*yco 22 asp.net-mvc

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

/Customers/Edit/5
Run Code Online (Sandbox Code Playgroud)

我需要使用CustomerId=5,但我不想允许客户更改它.现在我使用以下方法隐藏ID:

<%= Html.Hidden("CustomerId") %>
Run Code Online (Sandbox Code Playgroud)

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

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

roy*_*yco 13

我的解决方案是使用Steven Sanderson的ASP.NET MVC书籍中的Tamper Proofing代码.这个想法是你创建一个你想要防篡改的隐藏表单字段的哈希:

<%= Html.Hidden("CustomerId") %>
<%= Html.Hidden("CustomerIdHash") %>
Run Code Online (Sandbox Code Playgroud)

提交表单后,Steven的代码会计算CustomerId的另一个哈希,并确保它等于CustomerIdHash.如果是,则不会发生篡改.这是伟大的代码,值得这本书的价格.

  • 确保你加盐哈希,否则你什么都没得到!(我相信这本书会更详细地解释这一点.) (4认同)

Dmi*_*ets 10

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


180*_*ION 6

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