【问题标题】:TempData: Is It Safe?TempData:安全吗?
【发布时间】:2011-11-23 14:12:15
【问题描述】:

我使用TempData 是为了在使用RedirectToAction 时保留我的模型。它工作正常,但我有一种唠叨的感觉,它可能不是正确的做法。我真的尽量避免使用 Session 数据,而且我读过 TempData 使用 Session。使用安全吗?在负载平衡环境中使用它可能会出现问题吗?

琐事问题:“安全吗?”——给电影命名。

【问题讨论】:

    标签: asp.net-mvc tempdata


    【解决方案1】:

    是的,TempData 由会话存储支持,因此如果您处于负载平衡环境中,则在使用它时必须格外小心(粘性会话、持久会话状态等)。

    TempData 是使用 PRG 模式时事实上的选择,也是它的设计目的。

    至于这样做是否正确……这取决于您的用例!

    PS 马拉松人。

    【讨论】:

      【解决方案2】:

      好吧,我认为这取决于。如果您使用负载平衡器和多个前端服务器处理大量流量,则应避免使用会话对象,因为它可能会降低性能并使热点扩展变得困难(场上的请求并不总是来自同一个 Web 服务器)。

      TempData 是短暂的,如果你不在那里放置很多对象并三思而后行整个架构,我认为它是安全的。有很多网站广泛使用它并且没有任何问题(我在共享和专用托管网站上工作,平均每天有 50-70k 访问者使用会话,通常在同一台服务器上使用 web 和 db)。

      【讨论】:

        【解决方案3】:

        我会尽可能采用完全无状态的方法。它更具可扩展性,并且不受单个服务器问题的影响。通常,您可以只使用 cookie(适当保护以防篡改)来识别用户并每次从数据库中提取数据。

        除此之外,我还建议您评估是否可以使用View 而不是RedirectToAction。这个:

        TempData["model"] = model;
        return RedirectToAction("SomeAction");
        

        可以替换为:

        return View("SomeAction", model);
        

        当然,假设“SomeAction”是一个可以从当前控制器访问的有效视图(它是同一个 ctrl 中的一个视图或在 Shared 中定义的一个视图),并且它不仅仅是一个重定向到另一个的中间操作。

        【讨论】:

        • 我在返回 View() 时遇到的一个问题是,如果该操作是一个帖子,那么在浏览器中刷新会弹出烦人的消息——如果可能的话,我喜欢以 get 结束。也许这有点傻 - 再说一遍,临时数据无论如何都会在刷新时丢失 - 所以也许这是一个有争议的问题。
        • 嗯,但你实际上应该遵循 RESP 原则。如果一个动作正在读取数据,它应该(通常)是一个 GET。如果操作正在修改数据,它应该是一个 POST(并且从不一个 GET)。
        • @DarioSolera 您仍然可以这样做并以 GET 结束。假设我有一个修改数据的操作。它在 POST 操作方法中。如果该操作的验证(服务器端)失败,您可以将所有内容推入 TempData 并重定向回 GET 页面,这样它将显示您的所有模型验证错误等,如果您刷新页面,它就会清除页面而不是收到重新发布的消息。
        • 你知道你不能用重定向传递复杂的变量,对吧?这就是我们使用 TempData 的原因。
        • @DarioSolera 你是说 REST 原则吗?
        【解决方案4】:

        会话状态可以在集群环境中工作,前提是发生以下两种情况之一

        1. 您的负载均衡器支持"sticky" sessions(即给定会话中的所有请求都路由到同一台机器)
        2. 您将会话提供程序配置为使用进程外会话提供程序,您可以使用ASP.NET State ServiceSQL Session State Provider

        是否应该使用 tempdata 是一个完全不同的问题。我认为通常有办法解决它。如果您试图避免对数据库的冲击以重新加载一个操作已经加载的对象,请考虑使用缓存。

        【讨论】:

          【解决方案5】:

          我已限制使用 TempData 在视图和操作之间传递模型对象验证消息。我没有从安全角度研究 Tempdata 的使用,但在 SO 线程讨论相同:HttpContext.Items with ASP.NET MVC。请参阅最后几个线程 cmet 和相关讨论。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-03
            • 1970-01-01
            • 2010-11-20
            • 2019-12-07
            • 2016-03-06
            • 2010-09-26
            相关资源
            最近更新 更多