ViewState的值的编码是Base64,默认状况下,是没有加密的,很容易读出。
ViewState的值可以加密,首先,确保Page的EnableViewStatMac=true,然后在Machine.Config中配置machineKey。
默认Machine.Config中的machineKey:
ViewState的值可以加密,首先,确保Page的EnableViewStatMac=true,然后在Machine.Config中配置machineKey。
默认Machine.Config中的machineKey:
<!-- validation="[SHA1|MD5|3DES]" -->
<machineKey
validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps"
validation="SHA1" />
<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));
{
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
其中,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));
}
{
// 调用基类的方法,完成基本操作
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发送,是非常有用的。