一直在想怎么把ViewState里存的秘密找出来,今天在看aspnet4.chm时无意中发现的,使用此句ViewState["test"] = "ICU";后解码的图片:这样编码也不成问题,好像又多了一个可以入侵的地方。使用条件及下载地址:
http://www.microsoft.com/china/msdn/library/webservices/asp.net/0410viewstate.mspx?mfr=true使用方法:
把页面的__VIEWSTATE的value粘贴到viewstat string里,然后点decode即可

解决方案 »

  1.   

    我倒ViewState["test"] = "ICU";应为ViewState["id"] = "ICU";截错图了,
    链接里包含ViewState 基本原理
      

  2.   

    可以将ViewState驻留在服务器端。从很多年以前,至少从asp.net1.1开始,服务器端就会对ViewState进行mac验证,其实也难以入侵。
      

  3.   

    哦,可能我记错了,大概是从asp.net2.0以后才有对ViewState的MAC验证机制。不过asp.net2.0确实已经出来很多年了,所以我会记错。只要客户端改变一点ViewState,似乎就无法在服务器端骗过。微软的编程技术比较差(普通大学生就可以参与进去),但是架构师的设计和产品测试其实还是相当厉害的,这些方面考虑得相当全面。分析ViewState的内容,对于在Web上开发类似WinForm似的交互界面,具有指导意义,可以知道那些状态、事件是怎么来的。
      

  4.   


    try
                {
                    XmlDocument document;
                    LosFormatter formatter = new LosFormatter();
                    XmlDocument dom = ViewStateXmlBuilder.BuildXml(formatter.Deserialize(this._vsString.Text), out document);
                    this.PopulateTree(this._decodeTree, dom);
                    this.PopulateTree(this._decodeControlStateTree, document);
                    StringBuilder sb = new StringBuilder();
                    StringWriter writer = new StringWriter(sb);
                    dom.Save(writer);
                    this._rawXml.Text = sb.ToString();
                    sb = new StringBuilder();
                    writer = new StringWriter(sb);
                    document.Save(writer);
                    this._rawXmlControlState.Text = sb.ToString();
                    byte[] bytes = Convert.FromBase64String(this._vsString.Text);
                    char[] chars = new UTF8Encoding(false).GetChars(bytes);
                    StringBuilder builder2 = new StringBuilder();
                    foreach (char ch in chars)
                    {
                        if ((char.IsLetterOrDigit(ch) || char.IsPunctuation(ch)) || char.IsSeparator(ch))
                        {
                            builder2.Append(ch);
                        }
                        else
                        {
                            builder2.Append("&#");
                            builder2.Append(((int) ch).ToString());
                            builder2.Append(';');
                        }
                    }
                    this._rawText.Text = builder2.ToString();
                }
                catch (Exception exception)
                {
                    this._errorMessage.Text = "There was an error decoding the ViewState string: " + exception.Message;
                }