Как декодировать viewstate

Мне нужно увидеть содержимое viewstate на странице asp.net. Я искал декодер состояния представления, нашел декодер ViewState Fridz Onion, но он запрашивает URL страницы, чтобы получить его представление состояния. Поскольку мое состояние просмотра формируется после обратной передачи и появляется в результате операции на панели обновлений, я не могу предоставить URL. Мне нужно скопировать и вставить строку состояния и посмотреть, что внутри. Существует ли какой-либо инструмент или веб-сайт, который может помочь в просмотре содержимого viewstate?

22.08.2008 16:38:49
Разве это не просто версия сериализованных данных в кодировке Base 64?
mercutio 22.08.2008 16:44:02
Очень поздно, но любопытно, поможет ли этоstring str = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(txtViewState.Text));
Shubh 30.04.2015 10:59:31
Убедитесь, что ваш ViewState установлен как не зашифрованный , иначе ни один из этих инструментов (ответов) не сработает.
David Rogers 22.03.2017 20:59:49
Добавьте это в web.config: <pages viewStateEncryptionMode="Never">чтобы отключить шифрование ViewState для комментария @David Rogers.
Hans Vonn 2.08.2018 20:50:08
10 ОТВЕТОВ
РЕШЕНИЕ

Используйте Fiddler, возьмите состояние просмотра в ответе и вставьте его в левое нижнее текстовое поле, а затем декодируйте.

37
22.08.2008 16:40:16
Если вы не хотите устанавливать Fiddler, вы также можете использовать дополнение HttpFox для Firefox: addons.mozilla.org/en-US/firefox/addon/6647
Chris Shouts 4.11.2009 16:58:09
Я предполагаю, что что-то изменилось - текстовое поле в левом нижнем углу - это какая-то командная строка, а вставка в viewstate ничего не дает. Я не могу видеть, куда это пошло - это все еще в текущей версии?
Ian Griffiths 26.06.2012 21:59:42
Для тех, кто использует текущую версию Fiddler (2.5.1), текстовое поле, описанное в этом ответе, теперь можно найти, выбрав опцию TextWizard в меню вверху ( или Инструменты> TextWizard или Ctrl + E). Вставьте ViewState в верхнее поле, затем измените Transform на «From Base64».
Chris 30.07.2015 16:19:24
@Chris HttpFox дополнение Не совместимо с Firefox Quantum. Вы знаете какие-либо другие дополнения?
Iman 20.11.2018 06:01:00

Как уже упоминалось, это строка в кодировке base64. В прошлом я использовал этот сайт для его декодирования:

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

7
22.08.2008 16:49:45
Это сериализованный объект в кодировке base64, поэтому декодированные данные не особенно полезны. Лучше всего использовать правильный декодер View State.
James 12.02.2011 11:23:09
С другими декодерами я продолжаю получать ошибки декодирования. Это был первый способ, который действительно работает для меня. Конечно, это просто прямое декодирование строк, а не декодер состояния представления, но это продвигает меня гораздо дальше, чем что-либо еще. +1 Большое спасибо !!
Richard 15.06.2012 13:11:12

Вы можете игнорировать поле URL и просто вставить viewstate в поле Viewstate string.

Похоже, у вас есть старая версия; методы сериализации изменились в ASP.NET 2.0, поэтому возьмите версию 2.0

2
22.08.2008 16:50:35

Обычно ViewState должен быть дешифруемым, если у вас есть машинный ключ, верно? В конце концов, ASP.net должен расшифровать его, и это, конечно, не черный ящик.

0
22.08.2008 17:15:06
конечно, вы правы. Я имел в виду, что если он зашифрован, вы не сможете легко
Josh Hinman 22.08.2008 17:19:29
На всякий случай, если кто-нибудь наткнется на этот ответ ... ViewState никогда не шифруется. Он просто закодирован в base64. Ключ не нужен.
Rap 30.01.2014 23:12:04
@Rap В .NET 4.5 я не могу просто base64 его декодировать. Это больше, чем это. Онлайн-инструменты просто возвращают пустую строку, в то время как декодеры ViewState выдают какую-то ошибку. Это заставляет поверить , что даже если он не зашифрован сам по себе он является кодируются вне только base64.
ahwm 18.05.2015 15:59:02
@ahwm Правдивая история. .Net 4.5 шифрует ViewState. Это не было правдой, когда я написал свой комментарий 16 месяцев назад, но это сейчас. Ты прав.
Rap 19.05.2015 18:02:45
@Rap Спасибо за это разъяснение. Это имеет смысл, почему это не сработало для меня, но были посты и посты о том, как его декодировать. Я думал, что схожу с ума или что наша собственная CMS делает странные вещи.
ahwm 19.05.2015 20:03:57

Вот онлайн-декодер ViewState:

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

Редактировать: К сожалению, ссылка выше не работает - вот еще один декодер ViewState (из комментариев):

http://viewstatedecoder.azurewebsites.net/

40
14.07.2015 10:44:00
+1 Хорошая ссылка на Online View State Decoder проста в использовании и работает. Спасибо за этот ответ
Catto 2.11.2012 15:25:05
Если это говорит о том , что сериализованные данные некорректны, попробуйте viewstatedecoder.azurewebsites.net вместо: работал над чем - то , где этот декодер из ошибочных.
Roman Starkov 16.07.2014 23:23:21
Format marker: C9,Unknown format marker, exiting!
Fredrick Gauss 24.05.2017 12:48:20
viewstatedecoder.azurewebsites.net дал мне YSOD, если я вставил строку представления длиной 6 м.
Anders Lindén 1.06.2017 11:18:54
Маркер формата: 9E Неизвестный маркер формата, выход! Вот значение ViewState, которое я использовал pastebin.com/cvPAmCxr
Diomedes Domínguez 26.06.2018 19:44:56

Вот исходный код визуализатора ViewState из статьи Скотта Митчелла о ViewState (25 страниц)

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();
        }
14
15.05.2012 16:26:58
код работал для меня, но мне нужно было добавить ссылку на одну из сборок, фактически задействованных в создании состояния представления
Maslow 16.01.2015 16:32:49
Вам нужно включить ссылку на «System.Web» в ваш проект, если вы вставите ее в консольное приложение. В противном случае он не будет строить ...
David Rogers 22.03.2017 17:26:25

JavaScript-ViewState-Parser:

Парсер должен работать с большинством незашифрованных ViewStates. Он не обрабатывает формат сериализации, используемый в .NET версии 1, потому что эта версия очень устарела и, следовательно, слишком маловероятна, чтобы встретиться в любой реальной ситуации.

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


Парсинг .NET ViewState


4
10.03.2013 18:07:43
Этот работал для меня в Firefox, даже когда другие парсеры viewstate не работали. Ссылки на статью приветствуются.
Doug Domeny 8.10.2013 19:57:38

Онлайн Viewstate Viewer, созданный Lachlan Keown:

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

1
10.03.2013 18:16:26
Хотя это может дать ответ на вопрос, было бы предпочтительным включить сюда основные части ответа и предоставить ссылку для справки.
Taryn♦ 10.03.2013 20:20:33
@bluefeet Что еще можно добавить? Единственная существенная часть - это сам декодер. Два других автора сделали то же самое и только опубликовали ссылку.
XP1 11.03.2013 00:25:19

Это несколько «родной» .NET способ преобразования ViewState из строки в код StateBag ниже:

public static StateBag LoadViewState(string viewState)
    {
        System.Web.UI.Page converterPage = new System.Web.UI.Page();
        HiddenFieldPageStatePersister persister = new HiddenFieldPageStatePersister(new Page());
        Type utilClass = typeof(System.Web.UI.BaseParser).Assembly.GetType("System.Web.UI.Util");
        if (utilClass != null && persister != null)
        {
            MethodInfo method = utilClass.GetMethod("DeserializeWithAssert", BindingFlags.NonPublic | BindingFlags.Static);
            if (method != null)
            {
                PropertyInfo formatterProperty = persister.GetType().GetProperty("StateFormatter", BindingFlags.NonPublic | BindingFlags.Instance);
                if (formatterProperty != null)
                {
                    IStateFormatter formatter = (IStateFormatter)formatterProperty.GetValue(persister, null);
                    if (formatter != null)
                    {
                        FieldInfo pageField = formatter.GetType().GetField("_page", BindingFlags.NonPublic | BindingFlags.Instance);
                        if (pageField != null)
                        {
                            pageField.SetValue(formatter, null);
                            try
                            {
                                Pair pair = (Pair)method.Invoke(null, new object[] { formatter, viewState });
                                if (pair != null)
                                {
                                    MethodInfo loadViewState = converterPage.GetType().GetMethod("LoadViewStateRecursive", BindingFlags.Instance | BindingFlags.NonPublic);
                                    if (loadViewState != null)
                                    {
                                        FieldInfo postback = converterPage.GetType().GetField("_isCrossPagePostBack", BindingFlags.NonPublic | BindingFlags.Instance);
                                        if (postback != null)
                                        {
                                            postback.SetValue(converterPage, true);
                                        }
                                        FieldInfo namevalue = converterPage.GetType().GetField("_requestValueCollection", BindingFlags.NonPublic | BindingFlags.Instance);
                                        if (namevalue != null)
                                        {
                                            namevalue.SetValue(converterPage, new NameValueCollection());
                                        }
                                        loadViewState.Invoke(converterPage, new object[] { ((Pair)((Pair)pair.First).Second) });
                                        FieldInfo viewStateField = typeof(Control).GetField("_viewState", BindingFlags.NonPublic | BindingFlags.Instance);
                                        if (viewStateField != null)
                                        {
                                            return (StateBag)viewStateField.GetValue(converterPage);
                                        }
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                if (ex != null)
                                {

                                }
                            }
                        }
                    }
                }
            }
        }
        return null;
    }
3
28.06.2013 18:13:01

Вот еще один декодер, который хорошо работает с 2014 года: http://viewstatedecoder.azurewebsites.net/

Это работало на входе, на котором Ignatu-декодеру не удалось выполнить «Сериализированные данные недействительны» (хотя он оставляет сериализованные данные BinaryFormatter не декодированными, показывая только их длину).

6
16.07.2014 23:21:19