ViewState介绍和总结(2)--------ViewState的使用和优缺点

asp.net viewState 那么,有了这个隐藏域,页面里其他所有的控件的状态,包括页面本身的一些状态都会保存到这个控件值里面. 每次页面提交时一起提交到后台,asp.net对其中的值进行解码,然后输出时再根据这个值来恢复各个控件的状态. 我们再看这个控件的value值,它可能类似如下的形式:Oz4+O2w8aTwxPjs+O2w8…当请求某个页面时,ASP.NET会把所有控件的状态序列化成一个字符串,然后作为窗体的隐藏属性送到客户端,当客户端吧页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。......... 阅读详情

1.     ViewState的使用

ViewState的使用比较简单,主要是赋值和取值两步操作:

赋值:ViewState[key] = value;

取值:value = ViewState[key];

最主要的作用就是可以在当前页面保存值,ASP.NET的页面状态维护就是使用ViewState来实现的,基本上每一个ASPX页面都可以看到如下类似的html代码:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTkwNjc4NTIwMWRkyv4ncofW5vaWXdXRtXfXn3RYQR4="/>也就是说ViewState中的值实际上都是通过一个hidden(隐藏域)来保存的,hidden(隐藏域)的name__VIEWSTATE,那么如果页面上有另外一个控件的名称也叫:__VIEWSTATE的话,会导致页面出错,因为同一个页面上不允许有两个相同ID的控件。其实在我们进行页面开发或者进行自定义控件开发的时候,都可以使用ViewState,用来保存当前页面的一些状态值,这样是非常方便的。ViewStateASP.NET中特有的,相对于Session来说,它保存的值只能在当前页面使用,并且保存的只能是已经序列化的类,比如.NET中的strings, integers, Booleans, arrays, ArrayList, hashtableDataTableList<T>等。那么如何将自定义的类放入ViewState中呢,这个就涉及到序列化的问题了:序列化简单来说就是把一个对象转化成一种可以持久保存的数据,当下次需要使用时再把之前保存的数据反序列化成一个对象。当然在.NET中提供了简便的方法进行序列化的操作

下面我以一个简单的例子来说明:

3.  ViewState的序列化与反序列化

PageStatePersister 是一个抽象类,是表示将ViewState信息序列化及反序列化机制的基类。在Page.LoadPageStateFromPersistenceMedium中示意代码如下:

protected internal virtual object LoadPageStateFromPersistenceMedium()

{

          PageStatePersister pageStatePersister = this.PageStatePersister;

          pageStatePersister.Load();

          return new Pair(pageStatePersister.ControlState, pageStatePersister.ViewState);

}

Page.SavePageStateToPersistenceMedium中的示意代码如下:

protected internal virtual void SavePageStateToPersistenceMedium(object state)

{

        PageStatePersister pageStatePersister = this.PageStatePersister;

        Pair pair = (Pair) state;

        pageStatePersister.ControlState = pair.First;

        pageStatePersister.ViewState = pair.Second;

        pageStatePersister.Save();

}

Asp.net2.0中实现PageStatePersister这个抽象类,具体提供持久化机制的类是HiddenFieldPageStatePersister。它实现了LoadSave两个方法,Load时将__VIEWSTATE反序列化为一个Pair对象,Save时将Pair对象序列化为一个字符串赋值给Page.ClientStateHiddenFieldPageStatePersister中采用的格式器是ObjectStateFormatter,其实现string Serialize(object state),和object Deserialize(string serializedState)这两个方法,从而实现对Pair对象的序列化和反序列化。

public string Serialize(object state)中的示意代码如下:

MemoryStream memoryStream = GetMemoryStream();

Serialize(memoryStream, state);

byte[] buf = memoryStream.GetBuffer();

if (RequiresViewStateEncryptionInternal)

{

 buf = MachineKeySection.EncryptOrDecryptData(true, buf, this.GetMacKeyModifier(), 0, length);

 length = buf.Length;

}

else if (EnableViewStateMac)

{

buf = MachineKeySection.GetEncodedData(buf, this.GetMacKeyModifier(), 0, ref length);

}

return Convert.ToBase64String(buf, 0, length);

state序列化为内存流,在将其转换为字节流。如果需要加密则对其进行加密处理,否则需要Mac则进行Mac处理。最后将字节流进行Base64编码转换为字符串。

public object Deserialize(string serializedState) 中的示意代码如下:

byte[] buf = Convert.FromBase64String(serializedState);

int length = buf.Length;

if (ContainsEncryptedViewState)

{

buf = MachineKeySection.EncryptOrDecryptData(false, buf, this.GetMacKeyModifier(), 0, length);

 length = buf.Length;

}

else if (EnableViewStateMac)

{

buf = MachineKeySection.GetDecodedData(buf, this.GetMacKeyModifier(), 0, length, ref length);

}

MemoryStream memoryStream = GetMemoryStream();

memoryStream.Write(buf, 0, length);

return this.Deserialize(memoryStream);

将字符串进行Base64解码为字节流,如果需要解密则进行解密处理,否则需要进行需要Mac则进行Mac处理,将字节流转换为内存流,进行反序列化返回Pair对象。

4.  ViewState的优缺点:

(1)优点:

    耗费的服务器资源较少(与ApplicationSession相比)。因为,视图状态数据都写入了客户端计算机中。

    易于维护。默认情况下,DotNet系统自动启用对状态数据的维护。

    因为它不使用服务器资源、不会超时,并且适用于任何浏览器。

(2)缺点:

         性能问题。由于视图状态存储在页本身,因此如果存储较大的值,用户显示页和发送页时的速度仍然可能减慢。ViewState 增加了发送到浏览器的页面的大小,同时也增加了回传的窗体的大小,因此不适合存储大量数据。

设备限制。移动设备可能没有足够的内存容量来存储大量的视图状态数据。

潜在的安全风险。视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,尽管 ViewState 数据已被编码,并且可以选择对其进行加密,但始终不将数据发送到客户端才是最安全的。

5.       ViewState的安全性:

ViewState将一些信息保存在客户端,而且默认情况下客户端的数据仅仅是进行了Base64编码了,很容易被看到原文。当然ViewState还有一些安全性措施来改善这一点。ViewState 安全性对于处理和呈现 ASP.NET 页面所需的时间有直接的影响。简单地说,安全性越高,速度越慢。因此如果不需要,不要为 ViewState 添加安全性。

(1)  MAC

MACmessage authentication check的简写即消息验证检查。MAC可以防止ViewState数据被篡改。可以通过设置EnableViewStateMAC="true"属性来启用消息验证检查。可以在页面级别上设置 EnableViewStateMAC,也可以在应用程序级别上设置。有一点需要特别说明的是在MSDN中说EnableViewStateMAC的默认值是Flase,但是实际上发现EnableViewStateMAC的默认值是True,这一点大家可以Page_Load中输出EnableViewStateMAC属性来验证。也就是说默认情况下都是对ViewState进行防篡改处理的。在ObjectStateFormatter中进行序列化的时候如果EnableViewStateMAC="true",则在MachineKeySection.GetEncodedData中根据字节流buf计算出一个20位的字节表示Hash值,增加在buf字节流的后边,形成一个新的字节流。

ObjectStateFormatter中进行反序列化的时候如果EnableViewStateMAC="true",则在MachineKeySection.GetDecodedData中取buf的前(length-20)位计算出一个20位的字节表示Hash值,将这个Hash值与buf的最后20位进行比较,如果不一直则说明ViewState被篡改了则抛出异常。

默认情况下,.NET框架使用SHA1算法来生成ViewState散列代码。此外,也可以通过在machine.config文件中设置<machineKey>来选择 MD5 算法,如下所示:<machineKey validation="MD5" />。MD5算法的性能要比SHA1算法好一些,但是同样不够安全。

(2)  ViewState加密

默认情况下__VIEWSTATE中存储的值仅仅仅进行了Base64编码,并没有进行加密,如果ViewState中有一些保密信息需要增加它的安全性,这样我们可以对ViewState进行加密。我们可以设置ViewStateEncryptionMode的值来决定是否加密,其值是“Auto”,“Always”,“Never”,默认值是“Auto”。“Always”表示进行加密,“Never”表示不进行加密,“Auto”时如果调用了RegisterRequiresViewStateEncryption方法后则进行加密。ViewStateEncryptionMode属性不能在代码中设置page指令或者配置文件中使用。

(3)  设置ViewStateUserKey

设置 ViewStateUserKey 属性有助于防止您的应用程序受到恶意用户的点击式攻击。必须在页处理的 Page_Init 阶段设置此属性。具体的信息可以参照MSDN中的说明:http://msdn2.microsoft.com/zh-cn/library/ms972969.aspx

(4)  ViewState的禁用

因为ViewState会一定程度上影响性能所以在不需要的时候禁用 ViewState。默认情况下 ViewState 将被启用,并且是由每个控件(而非页面开发人员)来决定存储在 ViewState 中的内容。有时,这一信息对应用程序并没有什么用处。尽管也没什么害处,但却会明显增加发送到浏览器的页面的大小。因此如果不需要使用 ViewState,最好还是将它关闭,特别是当 ViewState 很大的时候。通过将对象的EnableViewState属性设置为False禁用ViewState。可以针对单个控件、整个页面或整个应用程序禁用ViewState,如下所示:

每个控件(在标记上)<asp:datagrid EnableViewState="false" />

每个页面(在指令中) <%@ Page EnableViewState="False" %>

每个应用程序(在 web.config 中) <Pages EnableViewState="false" />

以下情况将不再需要ViewState:(1)控件未定义服务器端事件(这时的控件事件均为客户端事件且不参加回送的);(2)控件没有动态的或数据绑定的属性值。

(5)  ViewState的优化

ViewState优缺点并存,有些人支持使用,有些人反对使用,也有人提出了对ViewState的优化,主要是压缩ViewState减少传输量及修改ViewState的存储位置。

 

常见web漏洞(awvs、nessus)验证方法小记-中危漏洞 1.【中危】不安全的Javascript库(Vulnerable Javascript library) 漏洞描述 SWFObject库 SWFObject是一个免费的开放源代码工具,用于在网站中嵌入swf内容,SWFObject在Internet Explorer中进行动态嵌入的方法,以使用更友好的W3C方式创建。网站正在使用易受攻击的Javascript库,此版本的Javascript库报告了... 阅读详情

相关推荐

WebForms ViewState

WebForms ViewState是一种客户端存储技术,用于在服务器端客户端之间同步表单控件的状态。当用户填写表单并发送请求到服务器时,Web Forms框架会将表单控件的状态信息序列化成字符串,并将其存储在客户端的隐藏字段中。当用户再次提交表单时,服务器会从隐藏字段中解析出控件的状态,并将其恢复到之前的状态。WebForms ViewState是一种方便、实用的客户端存储技术,在ASP.NET Web Forms框架中扮演着重要角色。

xyq2024的博客 585

asp.net 处理原文件中过长的viewstate代码

asp.net网页原文件中总出现一段很长的viewstate代码看着就头痛 所以在网上找了篇文章解决了这个问题,虽然VIEWSTATE没有完全隐藏,但大大的改善了网页源文件中VIEWSTATE的长度。

ViewState、Session、Cache区别

1、ViewState保存在页面上,不占用服务器内存,但是因为值保存在页面上,所以页面回发的时候比较耗流量。Session保存在服务器上,大量使用的话会很占用内存。 2ViewState永不过期,Session默认20分钟过期,Cache应用程序生命周期一样,应用程序结束,Cache清空。 3、viewstate并不是能存储所有的.net类型数据,它仅仅支持String、Integer、B

aiminXMPP的专栏 1345

加密的视图(__VIEWSTATE)参数漏洞验证测试

目录 1.前言 2.__VIEWSTATE视图参数未加密漏洞概述 3.漏洞验证 3.1 Burp抓包验证 3.2 ViewStateDecoder2工具验证 4.漏洞修复 1.前言 前几天在对网站进行安全性测试时,AWVS漏扫发现未加密__VIEWSTATE视图参数漏洞。__VIEWSTATE参数未加密,增大了ViewState存储的信息被窃取的风险。 afei 漏洞等级:中危 2.__VIEWSTATE视图参数未加密漏洞概述 由于_...

afei001 4330

浅谈ViewState

一、什么是ViewState 二、使用

我在等那么一天的博客 1万+

加密的__VIEWSTATE参数(中危)

复现危害较低的漏洞:未加密的__VIEWSTATE参数

qq_44828901的博客 7307

ASP.NET 2.0 页面状态持续程序

发布日期: 2006-3-1 | 更新日期: 2006-3-1Matt GibbsDevelopment Lead, Web Platform and Tools适用于:ASP.NET 2.0Visual Studio 2005ASP.NET 控件的开发人员利用 ViewState 控件状态来保持浏览器发出的各请求之间的状态信息。通常,该信息作为由页面呈现的 HTML

生产与管理信息化 1100

ASP.NET中的viewstate使用

.netviewstate的原理使用 如果在客户端服务器段保持往返的状态,在.net中通过加入一个隐藏控件_ViewState来实现的,这些状态的保持不需要程序员来控制,节省了程序员的精力。但是如果大量使用viewstate会影响性能,例如页面中控件过多,那么会影响页面性能,可以通过禁止viewstate来解决这个问题。可以禁止整个页面的viewstate也可以禁止某个控件的views

鹰击长空 1万+

ViewState 及效率

ViewState 及效率 服务器端 viewstate 一、首先谈一下服务器端 ViewState 的好处弊端 1.服务器端 ViewState 的好处 1).避免了网络故障带来的 ViewState 传输错误问题 2).避免了浏览器版本带来的 HiddenFiled大小限制的问题 3).减少了传送至客户端的页面大小——因为...

weixin_30732825的博客 94

.net viewstate 与静态变量的优缺点

.Net平台下进行CS软件开发时,我们经常遇到以后还要用到某些变量上次修改后的值,为了简单起见,很多人都习惯用static来定义这些变量,我也是。这样非常方便,下一次调用某个函数时该变量仍然保存的是处理过的值,直接拿来用就可以了。 现在转入了BS软件开发,我们很自然地会沿用这种习惯。如在页面中统计某个按钮被按下的次数,先在类中OnClick事件的处理过程前定义一static变...

diancuiji9577的博客 164

靈活運用 ASP.NET 內建 ViewState 功能改善網站執行效率

主題:靈活運用 ASP.NET 內建 ViewState 功能改善網站執行效率作者: Eric Huang 什麼是ViewState簡單的說 ViewState 的功能就是保存網頁上所有的資料,好處是當PostBack發生時,資料不會不見(包含Dropdownlist,checkbox ... 都會保持在你選的那一個)例如說你在textbox中打了你的名子,PostBack後你的名子還是會出現在t

.NET技术专栏 3711

Session,Cookie,ApplicationViewState的区别

一、Application使用它时要注意避免性能的降低,存储的数据尽可能提供给客户只读的功能。使用:Global.asax:使用:读操作string str = Application["Exp"].ToString();使用:写操作        Application.Lock();        Application["Exp"] = "write";        Application.UnLock();由于Ap

玩转2010 2802

Viewstate到底应该怎么使用

Viewstate是用来干什么的 在Web页的请求过程中保存控件的状态:该状态是指在页面CS文件中修改的空间的值,比如在TextBox中直接填的值是不受影响的 也可以自定义Viewstate来保存一些在本页面使用的状态 使用Viewstate的优点缺点 优点: 使用简单,ASP.NET已经完全实现了该功能,在控件中默认保存了他的状态。 ...

weixin_30341735的博客 149

ASP.Net ViewState的实现

  选择自 timmy3310 的 Blog ViewState.Net中提出的状态保存的一种新途径(实际上也是老瓶装新酒);我们知道,传统的Web程序保存状态的方式有这样几种:  1、Application 这是Web应用程序生命期中的全局保存区,保存在Application中的数据是全局有效的;在Asp.Net中,有一个应用程序池,其中保存了数个(或数十个)应用程序实例,每一次请求都会从池中

深度Java 3498

viewstate

  ASP.NET中,为了模拟Winform中的事件响应机制,微软的工程师真是煞费苦心,发明了“回发”机制,使得编写WEB页面变得Winform一样简单。所谓回发机制,其实说白了就是自己发送给自己(本页面)而已。下面我们新建一个网站,打开默认添加的Default.aspx页面,form部分代码如下:   1 &lt;form id="form1" runat="server" &gt;2...

weixin_33884611的博客 128

Application, Session, Cookie, Viewstate, Cache对象用法、作用域区别

1.Application:用于保存所有用户共用的数据信息。 在Asp.Net中类似的配置数据最好保存在Web.config文件中。如果使用Application对象,一个需要考虑的问题是任何写操作都要在 Application_OnStart事件(global.asax)中完成。尽管使用Application.Lock Application.Unlock方法来避免写操作的同步,但是...

dcke31608的博客 124
上一篇: ViewState介绍和总结(1)--------ViewState的介绍
下一篇: Sharepoint EventHandler使用总结
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值