前幾日,培訓系統爆出兩個Bug,都是外網通過WebVPN訪問產生的,在內網訪問一 點問題都沒有,該問題描述如下:
- 帶有MagicAjax 的頁面都報錯,說找不到 /AjaxCallObject.js
- 考試頁面出現一堆ICag的字串
第一個問題,我認為是以用的路徑不對,於是我尋找產生的HTML Dode,發現串連是被改了的,但是還是可以訪問出來,於是我嘗試強制引入該 JS,問題依舊, 我再把該JS檔案的內容Copy 到網頁中,問題依舊頭痛,先放下畢竟只是一個彈出框,不影響使用者的使用,只是少一點Ajax的絢麗。
第二個問題還是通過查看ICag是什麼東東,經過和在內網訪問產生的HTML代碼進行對比發現 ViewState 前面的一段不知所終,那一堆ICag就是ViewState 裡的東西
於是,我想看來是WebVPN對ViewState是有點偏見,於是我想我把ViewState替換替換看看怎麼樣,但是怎麼替換呢?
我突然想到以前看過的文章壓縮ViewState,於是一頓Baidu 找到了
程式如下: #region 壓縮ViewState
protected override void SavePageStateToPersistenceMedium(Object pViewState)
{
LosFormatter mFormat = new LosFormatter();
StringWriter mWriter = new StringWriter();
mFormat.Serialize(mWriter, pViewState);
String mViewStateStr = mWriter.ToString();
byte[] pBytes = System.Convert.FromBase64String(mViewStateStr);
pBytes = Compress(pBytes);
String vStateStr = System.Convert.ToBase64String(pBytes);
RegisterHiddenField("__MSPVSTATE", vStateStr);
}
protected override Object LoadPageStateFromPersistenceMedium()
{
String vState = this.Request.Form.Get("__MSPVSTATE");
byte[] pBytes = System.Convert.FromBase64String(vState);
pBytes = DeCompress(pBytes);
LosFormatter mFormat = new LosFormatter();
return mFormat.Deserialize(System.Convert.ToBase64String(pBytes));
}
public static byte[] Compress(byte[] pBytes)
{
MemoryStream mMemory = new MemoryStream();
Deflater mDeflater = new Deflater(ICSharpCode.SharpZipLib.Zip.Compression.Deflater.BEST_COMPRESSION);
ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream mStream = new ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream(mMemory,mDeflater,131072);
mStream.Write(pBytes,0,pBytes.Length);
mStream.Close();
return mMemory.ToArray();
}
public static byte[] DeCompress(byte[] pBytes)
{
ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream mStream = new ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream(new MemoryStream(pBytes));
MemoryStream mMemory = new MemoryStream();
Int32 mSize;
byte[] mWriteData = new byte[4096];
while(true)
{
mSize = mStream.Read(mWriteData, 0, mWriteData.Length);
if (mSize > 0)
{
mMemory.Write(mWriteData, 0, mSize);
}
else
{
break;
}
}
mStream.Close();
return mMemory.ToArray();
}
#endregion
運行,成功問題解決了。