【发布时间】: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