Welcome 微信登录

首页 / 网页编程 / ASP.NET / 安全简报: 视图状态安全

安全简报: 视图状态安全2012-03-29 MSDN Bryan Sullivan在 Web 应用程序中有效管理用户状态需要在性能、可扩展性、可维护性和安全性之间取得精妙的平衡 。在管理客户端上储存的用户状态时,安全考虑就显得额外重要。我的一个同事曾经说过,处理客户端的 状态数据就像把蛋筒冰激淋交给一个 5 岁的孩子:您可以把冰激淋拿回来,但是您绝对不能期望拿回来 的时候冰激淋的形状还像给出去的时候一样!

在这个月的专栏中,我们会围绕 ASP.NET 应用程序中的客户端状态管理来探讨一些安全隐患,特别会 关注视图状态安全。(请注意:本文假设您熟悉有关 ASP.NET 视图状态的概念。)。

如果您认为应用程序的视图状态中存储的任何数据都不值得保护,请再仔细考虑一下。敏感信息甚至 会在您尚未察觉的时候进入视图状态中。即使您非常警惕,采取了防止敏感信息通过视图状态丢失的措施 ,攻击者仍然能够篡改视图状态,甚至会给您和您的用户带来更大的麻烦。幸运的是,ASP.NET 带有一些 内置的防御组件,用于防御这些攻击。让我们看看如何正确使用这些防御组件。

威胁 1:信息泄露

在 Microsoft,开发团队使用 STRIDE 模式对威胁进行分类。STRIDE 是首字母缩写,分别代表:

假冒

篡改

否认

信息泄露

拒绝服务

提升权限

视图状态安全所涉及到的两个主要 STRIDE 类别是信息泄露和篡改(成功的篡改攻击可能会导致提升 权限,我们会在后面详细进行讨论)。信息泄露是这些威胁中比较容易说明的,因此我们就先从它开始讨 论。

有关视图状态的一个最令人遗憾、最常见的误解就是,它经过了加密或其他方式处理,无法被用户读 取。毕竟,视图状态字符串看起来肯定不是可分解的:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjkPFgIeCHBhc3N3b3JkBQlzd29yZGZpc2hkZA==" />

然而,这个字符串只是 base64 编码的,没有采用任何强大的密码算法。我们能够通过受限对象序列 化 (LOS) 格式化程序类 System.Web.UI.LosFormatter 轻松对该字符串进行解码和反序列化:

LosFormatter formatter = new LosFormatter();
object viewstateObj = formatter.Deserialize ("/wEPDwULLTE2MTY2ODcyMjkPFgIeCHBhc3N3b3JkBQlzd29yZGZpc2hkZA==");

快速看一下调试器(请参见图 1),就能发现反序列化的视图状态对象实际上是一系列 System.Web.UI.Pair 对象,以包含值“password”和相应字符串值“swordfish”的 System.Web.UI.IndexedString 对象结尾。

图 1 调试器揭示的秘密视图状态数据

如果您不打算自己去费劲编写代码来反序列化视图状态对象,Internet 上有几种很好用的视图状态解 码器可供免费下载,包括 Fritz Onion 的 ViewState Decoder 工具,网址为: alt.pluralsight.com/tools.aspx。