62

asp.net ページのビューステートの内容を確認する必要があります。ビューステート デコーダーを探したところ、Fridz Onion の ViewState Decoderが見つかりましたが、ビューステートを取得するためにページの URL を要求されます。ビューステートはポストバック後に形成され、更新パネルでの操作の結果として生成されるため、URL を提供できません。ビューステート文字列をコピーして貼り付け、中身を確認する必要があります。ビューステートのコンテンツを表示するのに役立つツールまたは Web サイトはありますか?

4

11 に答える 11

42

オンラインの ViewState デコーダーは次のとおりです。

http://ignatu.co.uk/ViewStateDecoder.aspx

編集:残念ながら、上記のリンクは無効です-これは別のViewStateデコーダーです(コメントから):

http://viewstatedecoder.azurewebsites.net/

于 2011-02-07T11:35:37.323 に答える
39

Fiddlerを使用して応答のビュー ステートを取得し、左下のテキスト ボックスに貼り付けてからデコードします。

于 2008-08-22T16:40:16.457 に答える
15

ViewStateに関する Scott Mitchell の記事(25 ページ)からの ViewState ビジュアライザーのソース コードを次に示します。

using System;
using System.Collections;
using System.Text;
using System.IO;
using System.Web.UI;


namespace ViewStateArticle.ExtendedPageClasses
{
    /// <summary>
    /// Parses the view state, constructing a viaully-accessible object graph.
    /// </summary>
    public class ViewStateParser
    {
        // private member variables
        private TextWriter tw;
        private string indentString = "   ";

        #region Constructor
        /// <summary>
        /// Creates a new ViewStateParser instance, specifying the TextWriter to emit the output to.
        /// </summary>
        public ViewStateParser(TextWriter writer)
        {
            tw = writer;
        }
        #endregion

        #region Methods
        #region ParseViewStateGraph Methods
        /// <summary>
        /// Emits a readable version of the view state to the TextWriter passed into the object's constructor.
        /// </summary>
        /// <param name="viewState">The view state object to start parsing at.</param>
        public virtual void ParseViewStateGraph(object viewState)
        {
            ParseViewStateGraph(viewState, 0, string.Empty);    
        }

        /// <summary>
        /// Emits a readable version of the view state to the TextWriter passed into the object's constructor.
        /// </summary>
        /// <param name="viewStateAsString">A base-64 encoded representation of the view state to parse.</param>
        public virtual void ParseViewStateGraph(string viewStateAsString)
        {
            // First, deserialize the string into a Triplet
            LosFormatter los = new LosFormatter();
            object viewState = los.Deserialize(viewStateAsString);

            ParseViewStateGraph(viewState, 0, string.Empty);    
        }

        /// <summary>
        /// Recursively parses the view state.
        /// </summary>
        /// <param name="node">The current view state node.</param>
        /// <param name="depth">The "depth" of the view state tree.</param>
        /// <param name="label">A label to display in the emitted output next to the current node.</param>
        protected virtual void ParseViewStateGraph(object node, int depth, string label)
        {
            tw.Write(System.Environment.NewLine);

            if (node == null)
            {
                tw.Write(String.Concat(Indent(depth), label, "NODE IS NULL"));
            } 
            else if (node is Triplet)
            {
                tw.Write(String.Concat(Indent(depth), label, "TRIPLET"));
                ParseViewStateGraph(((Triplet) node).First, depth+1, "First: ");
                ParseViewStateGraph(((Triplet) node).Second, depth+1, "Second: ");
                ParseViewStateGraph(((Triplet) node).Third, depth+1, "Third: ");
            }
            else if (node is Pair)
            {
                tw.Write(String.Concat(Indent(depth), label, "PAIR"));
                ParseViewStateGraph(((Pair) node).First, depth+1, "First: ");
                ParseViewStateGraph(((Pair) node).Second, depth+1, "Second: ");
            }
            else if (node is ArrayList)
            {
                tw.Write(String.Concat(Indent(depth), label, "ARRAYLIST"));

                // display array values
                for (int i = 0; i < ((ArrayList) node).Count; i++)
                    ParseViewStateGraph(((ArrayList) node)[i], depth+1, String.Format("({0}) ", i));
            }
            else if (node.GetType().IsArray)
            {
                tw.Write(String.Concat(Indent(depth), label, "ARRAY "));
                tw.Write(String.Concat("(", node.GetType().ToString(), ")"));
                IEnumerator e = ((Array) node).GetEnumerator();
                int count = 0;
                while (e.MoveNext())
                    ParseViewStateGraph(e.Current, depth+1, String.Format("({0}) ", count++));
            }
            else if (node.GetType().IsPrimitive || node is string)
            {
                tw.Write(String.Concat(Indent(depth), label));
                tw.Write(node.ToString() + " (" + node.GetType().ToString() + ")");
            }
            else
            {
                tw.Write(String.Concat(Indent(depth), label, "OTHER - "));
                tw.Write(node.GetType().ToString());
            }
        }
        #endregion

        /// <summary>
        /// Returns a string containing the <see cref="IndentString"/> property value a specified number of times.
        /// </summary>
        /// <param name="depth">The number of times to repeat the <see cref="IndentString"/> property.</param>
        /// <returns>A string containing the <see cref="IndentString"/> property value a specified number of times.</returns>
        protected virtual string Indent(int depth)
        {
            StringBuilder sb = new StringBuilder(IndentString.Length * depth);
            for (int i = 0; i < depth; i++)
                sb.Append(IndentString);

            return sb.ToString();
        }
        #endregion

        #region Properties
        /// <summary>
        /// Specifies the indentation to use for each level when displaying the object graph.
        /// </summary>
        /// <value>A string value; the default is three blank spaces.</value>
        public string IndentString
        {
            get
            {
                return indentString;
            }
            set
            {
                indentString = value;
            }
        }
        #endregion
    }
}

テキスト ボックスからビューステートを読み取り、上記のコードを使用してグラフ化する簡単なページを次に示します。

private void btnParse_Click(object sender, System.EventArgs e)
        {
            // parse the viewState
            StringWriter writer = new StringWriter();
            ViewStateParser p = new ViewStateParser(writer);

            p.ParseViewStateGraph(txtViewState.Text);
            ltlViewState.Text = writer.ToString();
        }
于 2012-05-15T16:26:58.310 に答える
7

別の人が言ったように、これは base64 でエンコードされた文字列です。過去に、この Web サイトを使用してデコードしました。

http://www.motobit.com/util/base64-decoder-encoder.asp

于 2008-08-22T16:49:45.873 に答える
6

2014 年の時点でうまく機能する別のデコーダーを次に示します: http://viewstatedecoder.azurewebsites.net/

これは、Ignatu デコーダーが「シリアル化されたデータが無効です」で失敗した入力で機能しました (ただし、BinaryFormatter でシリアル化されたデータはデコードされず、その長さだけが表示されます)。

于 2014-07-16T23:21:19.650 に答える
5

JavaScript-ViewState-パーサー:

パーサーは、暗号化されていないほとんどの ViewState で動作するはずです。.NET バージョン 1 で使用されるシリアル化形式は処理されません。そのバージョンは非常に古く、実際の状況で遭遇する可能性が低すぎるためです。

http://deadliestwebattacks.com/2011/05/29/javascript-viewstate-parser/


.NET ViewState の解析


于 2013-03-10T18:07:43.280 に答える
2

URL フィールドを無視して、viewstate を Viewstate 文字列ボックスに貼り付けるだけです。

古いバージョンのようです。ASP.NET 2.0 でシリアル化方法が変更されたため、2.0 バージョンを入手してください

于 2008-08-22T16:50:35.620 に答える
2

Python での最善の方法は、このリンクを使用することです。

ASP.NET ビューステートをデコードするための小さな Python 3.5+ ライブラリ。

最初にそれをインストールします: pip install viewstate

>>> from viewstate import ViewState
>>> base64_encoded_viewstate = '/wEPBQVhYmNkZQ9nAgE='
>>> vs = ViewState(base64_encoded_viewstate)
>>> vs.decode()
('abcde', (True, 1))
于 2020-08-13T13:13:32.260 に答える
1

Lachlan Keown によって作成されたオンライン ビューステート ビューアー:

http://lachlankeown.blogspot.com/2008/05/online-viewstate-viewer-decoder.html

于 2013-03-10T18:16:26.013 に答える
0

通常、マシンキーを持っている場合、ViewState は復号化できるはずですよね? 結局、ASP.net は暗号化を解除する必要があり、それは確かにブラック ボックスではありません。

于 2008-08-22T17:15:06.107 に答える