ASP MVC - 如何替换viewstate?

时间:2014-01-13 08:28:00

标签: asp.net-mvc viewstate

我正在asp.mvc中编写一个应用程序。我有一个视图,显示具有特定ID的产品,并且在该视图上,用户可以修改产品。有一个带有颜色的下拉列表,用户可以选择。可用颜色的范围取决于用户的权限,并非所有用户都可以访问所有颜色。 当用户点击“保存”按钮时,ajax请求我们使用产品和所选颜色的ID发送到服务器。 这是问题所在: 当用户打开页面时,我会检查他是否有权编辑带有url中提供的id的产品,并且我只显示用户可以访问的那些颜色。但我无法保证用户修改他保存产品时发送的ajax请求。所以我可以显示ID为1的产品,ID为12,13,14的颜色,但是用户可以手动更改请求并将Product id更改为3(他不允许编辑)并选择颜色为15(他不应该甚至看不到。

在旧的webforms中这不是问题,因为产品的id可能已保存在viewstate中,而在服务器端我检查了选择了哪个下拉列表,然后我知道所选项的id是什么(存储在viewstate或controlstate)。你如何在MVC中解决这个问题?我是否必须检查用户是否有权访问每个元素两次,当我显示数据时以及何时收到它,例如在“保存”请求中?

3 个答案:

答案 0 :(得分:1)

我同意RononDex的回答。 Session为您提供了一种在用户服务器上存储数据的简便方法,而不会以可操作的方式公开数据。

所以你可以像这样存储产品ID:

Session["ProductId"] = however you get the id.

另外,您可以存储颜色:

Session["Colours"] = // Whatever you want, an array of int or List<int>

虽然有会话状态的警告,包括它可以被擦除,无论是通过该会话的到期(您可以控制发生之前的分钟数),或应用程序池刷新,所以承担记住。

这对你来说也许是一个很好的阅读:

http://brockallen.com/2012/04/07/think-twice-about-using-session-state/

因此会话状态有利有弊。如果您决定不使用会话状态,而是将ID值存储在HMTL中的隐藏字段中,那么请考虑对这些ID值进行散列或加密,以便用户无法查看它们是什么,或尝试更改它们。

答案 1 :(得分:1)

即使没有保护和关注的ViewState也可能会使您的Web服务器暴露于恶意内容。请注意:

  

因为它由纯文本组成,所以视图状态可能被篡改。虽然程序员不应该在视图状态(例如信用卡号,密码或连接字符串)中存储敏感数据,但不言而喻,视图状态可用于对服务器进行攻击。查看状态本身并不是一个安全漏洞,但就像您过去可能使用的查询字符串和其他隐藏字段一样,它是恶意代码的潜在载体。由于视图状态是经过编码,保护和验证的,因此它确实提供了比您可能用于编程目的的其他隐藏字段更多的安全功能。

正如Dino Esposito所说here

你有三个选择:

  1. 保护(加密)您隐藏的字段(当前的productId和颜色),并在用户发布后在服务器上验证它们。

  2. 使用会话(存储当前用户的工作上下文,即productId和颜色),以防选项3占用太多资源,或者您不想在服务器上维护大量的验证逻辑。

    < / LI>
  3. 在用户发布后验证对象的权限。如果无法接受选项2(您根本不使用会话)。

答案 2 :(得分:0)

TempData用于维护状态的情况,它存储在服务器上以供一个用户请求。