你能信任ViewState来处理程序控制吗?

时间:2014-03-18 22:35:47

标签: asp.net security viewstate

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

我看到如果你打开EnableViewStateMac,ViewState会被一个名为MAC的计算值签名,以检测它是否在往返过程中被篡改过,而ASP.NET会抛出一个如果它检测到MAC与客户端的ViewState数据不匹配则会出现异常。

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

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

以下是我想知道的两个具体例子,可以避免绕过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()(或任何需要检查的东西),但在某些情况下,该功能在计算上是昂贵的,并且它是检查基于昂贵函数的返回值修改的控件的状态要便宜得多。我知道有很多方法可以解决这个问题,例如存储函数返回值的临时副本等等,但这更像是一个概念问题,而不是"这是我的问题,现在为我解决了这个问题。 #34;问题

1 个答案:

答案 0 :(得分:0)

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