【问题标题】:MVC - Store variable to next requestMVC - 将变量存储到下一个请求
【发布时间】:2015-08-10 05:35:23
【问题描述】:

我有一种方法可以接收两个参数(int?,字符串)。我的控制器中的操作必须保存此变量并返回带有表单的视图。从客户端返回表单后,我需要之前请求中的这些变量。我可以将它们传递给 ViewBag 查看并添加到隐藏的表单中,但这非常危险,任何人都可以在浏览器中更改它。有什么想法吗?

我认为这个问题没有意义。 如果我有使用 HTTP GET 方法接收两个参数的方法,那么用户在 get 方法或表单中更改这两个变量没有区别。 如果我存储在服务器端,他可以在将参数传递给第一个方法时更改,服务器将存储错误的变量。
例如:
http://www.someurl.com/Controller/Action/?id=123&key=someKey
我可以通过编辑url来更改参数,所以很荒谬的存储它作为服务器端的变量,以确保用户不会通过编辑隐藏字段来更改它。此外,我可以检查密钥是否与具有此 ID 的数据库中的密钥相同。

【问题讨论】:

  • 是的,恶意用户可以使用 fiddler 等工具来更改隐藏输入的值。
  • 那为什么不使用会话呢?
  • 会话时间为 20 或 30 分钟。用户可以在会话时间结束时打开此表单并提交。用户不喜欢例外。
  • 你在变量中存储了什么会很危险的改变?
  • Key 和 id 将用于验证请求并在数据库中进行一些更改。

标签: asp.net-mvc var httpcontext viewbag


【解决方案1】:

会话时间为 20 或 30 分钟。用户可以在会话时间结束时打开此表单并提交。用户不喜欢例外

允许表单在一定时间后过期是非常标准的做法。您可以让会话永远打开,因为这是一个安全漏洞。

至于实际值,您可以在处理完第二页后立即将其从会话中删除。如果在第二页被点击时该值不存在,只需再次重定向到第一页并显示一条消息,指出它花费了太长时间。

您的第二个选项是使用TempData,它专门用于在两个页面之间存储值。用户无法访问TempData

第三个选项当然是将值存储在数据库中(在登录之间等时间保存它)

【讨论】:

    【解决方案2】:

    您可以在用户的​​当前会话中存储您喜欢的任何对象。在您的控制器中,您可以使用:

    // Save value to session
    Session["MyVariableName"] = 32;
    
    // Read value from session
    int myVariable = (int)Session["MyVariableName"];
    

    有关会议的更多信息,请参阅:https://msdn.microsoft.com/de-de/library/system.web.httpcontext.session(v=vs.110).aspx

    【讨论】:

    • 会话可能超时。
    • 如果这两个请求之间的时间跨度真的那么长,您应该考虑将其存储在数据库中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多