现在的位置: 首页 > 综合 > 正文

使用代码解析ViewSate的Base64值?

2011年03月10日 ⁄ 综合 ⁄ 共 1930字 ⁄ 字号 评论关闭
ViewState的值的编码是Base64,默认状况下,是没有加密的,很容易读出。
ViewState的值可以加密,首先,确保Page的EnableViewStatMac=true,然后在Machine.Config中配置machineKey。
默认Machine.Config中的machineKey:
<!--  validation="[SHA1|MD5|3DES]" -->
  
<machineKey
            
validationKey="AutoGenerate,IsolateApps"
            decryptionKey
="AutoGenerate,IsolateApps"
            validation
="SHA1" />

可以修改machineKey来使用某种加密方式,注意:加密由Machine Layer完成,要消耗系统资源。
本人关于加密ViewState没有测试。

通过使用浏览器,可以获取ViewState的隐藏内容,使用下面的代码,可以解析:

    private  string Base2String(string message)
        
{
            
byte[] by=System.Convert.FromBase64String(message);

            
string dest=System.Text.Encoding.ASCII.GetString(by);
            
return dest;

        }

//如果ViewState的值为"dDw5NDA0MTAzOTY7dDxwPGw8cGFzczs+O2w8RmlzaDs+Pjs7PjtsPF9jdGwwO2NoZWNrO19jdGwxO19jdGwyO19jdGwzO2NiOz4+";
string source="dDw5NDA0MTAzOTY7dDxwPGw8cGFzczs+O2w8RmlzaDs+Pjs7PjtsPF9jdGwwO2NoZWNrO19jdGwxO19jdGwyO19jdGwzO2NiOz4+";
Response.Write(Base2String(source));

可以获得:t<940410396;t

;l>;;>;l<_ctl0;check;_ctl1;_ctl2;_ctl3;cb;>>
其中,cb是指动态生成的CheckBox,共动态生成5个CheckBox,check是动态生成的第2个CheckBox的Id,其他的没有指定Id。

如果在Page的后台代码中完成上面的操作,需要重写SavePageStateToPersistenceMedium():

protected override void SavePageStateToPersistenceMedium(object viewState) 
        
{
            
// 调用基类的方法,完成基本操作
            base.SavePageStateToPersistenceMedium(viewState);
            
// 获取ViewState的Base64值
            LosFormatter format = new LosFormatter();
            StringWriter writer 
= new StringWriter();
            format.Serialize(writer, viewState);
            
string vsRaw = writer.ToString();
            Response.Write(
"ViewState Raw: " + Server.HtmlEncode(vsRaw));
            
// 解析内容
            byte[] buffer = Convert.FromBase64String(vsRaw);
            
string vsText = Encoding.ASCII.GetString(buffer);
            Response.Write(
"ViewState Text: " + Server.HtmlEncode(vsText));
        }

通过获取ViewState的值,可以有助于理解ViewState的目的和作用,毕竟ViewState中的StateBag,可以存储页面级的变量,通过PostBack发送,是非常有用的。

抱歉!评论已关闭.