【问题标题】:Can you trust ViewState to handle program control?你能相信 ViewState 来处理程序控制吗?
【发布时间】:2014-04-24 21:47:51
【问题描述】:

我在 MSDN 上阅读了很多关于 ViewState 的内容,并查看了以下问题(以及其他问题):

我看到如果你打开了EnableViewStateMac,ViewState 会使用一个称为 MAC 的计算值进行签名,以检测它是否在往返期间被篡改,如果 ASP.NET 检测到MAC 与客户端的 ViewState 数据不匹配。

对我来说,这意味着它是安全的,除非用于签署 ViewState 的私钥以某种方式进行了逆向工程,类似于 SSL 加密的工作方式。希望这是真的,但如果不是,请纠正我。我可能遗漏了 ASP.NET 如何在内部工作的另一篇文章,但在我看来,您应该能够依赖控件的状态来控制程序的执行和流程,因为修改控件状态的唯一方法是在服务器代码中基于包含对客户表单的有效更改的回发。

问题是:实际上,是否可以使用控件的状态(如果它不应该由用户更改)进行编程决策,可能的危险是什么以及如何这些会导致实际问题吗?

以下是我想知道的两个具体示例,可以避免通过 ViewState 篡改绕过(这是我正在做的模拟):

示例 1

Public Sub SetPageState()
    If User.IsLoggedIn() Then
        MultiView1.ActiveViewIndex = 0 'user is logged in
    Else
        MultiView1.ActiveViewIndex = 1 'user is not logged in
    End If
End Sub

Private Sub PersonalizePage()
    If MultiView1.ActiveViewIndex = 0 Then
        'Do logged-in stuff
    ElseIf MultiView1.ActiveViewIndex = 1
        'Do not-logged-in stuff
    End If
End Sub

示例 2

Public Sub SetUserLoginControl()
    Label1.Visible = User.IsLoggedIn()
End Sub

Private Sub DoLoginThings()
    If Label1.Visible Then
        'Do logged-in stuff
    Else
        'Do not-logged-in stuff
    End If
End Sub

我意识到“正确”的方法是在每个应该控制它的地方检查 User.IsLoggedIn() (或任何需要检查的),但在某些情况下,该函数的计算成本很高,并且检查基于昂贵函数的返回值修改的控件的状态要便宜得多。我意识到有一些方法可以解决这个问题,例如存储函数返回值的临时副本等,但这更像是一个概念性问题,而不是“这是我的问题,现在为我解决”的问题。

【问题讨论】:

    标签: asp.net security viewstate


    【解决方案1】:

    使用控件时您的代码不可读,这很糟糕。您可能希望在 HttpContect.Current.Items 字典中缓存 User.IsLoggedIn() 的状态。它有点像一个只为单个请求而存在的缓存。

    【讨论】:

    • 我编辑了代码以使其更清楚发生了什么。
    • @OranD Lord:你不明白我的意思——几个月后你的代码将无法被其他人或你阅读。
    • 也许你不明白我的意思。我在问使用控件的状态进行程序控制是否存在安全风险。如上一段所述,我对可能的替代方案不感兴趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2010-09-09
    • 2010-09-29
    相关资源
    最近更新 更多