【问题标题】:How to modify viewstate of a label in ASP.net如何在 ASP.net 中修改标签的视图状态
【发布时间】:2012-05-28 14:15:06
【问题描述】:

我在某处读到它可以修改视图状态,但我没有找到实现它的步骤。

例如:我想修改label的viewstate,最初的lable文本是“Hi..”,我想通过在回发时修改它的viewstate来把它改成“Hello”。 p>

任何建议将不胜感激。

【问题讨论】:

  • 只需使用标签的Text 属性更改标签文本即可;为什么需要修改视图状态?
  • 其实有人问我这个问题“我们如何修改控件的视图?”所以我试图找到这个问题的正确答案。
  • 知道了,但不建议这样做。如果您想修改它,您首先需要了解什么视图状态以及它是如何实现的。更好的起点是 MSDN 和研究。
  • 您可能需要更新问题以澄清您是否可以修改客户端上的视图状态并将其推送回服务器(如果这确实是您所要求的) .如果这是问题,georgefox 的答案是正确的。

标签: asp.net


【解决方案1】:

我猜你说的是作为最终用户恶意修改 __VIEWSTATE 隐藏字段,而不是从代码中修改 ViewState。这可能可行,也可能不可行(希望不可行),具体取决于您应用程序的某些设置。将使其变得非常困难的两个是EnableViewStateMacViewStateEncryptionMode。这些通常设置在 Web.config 中的 <pages> 元素上。

ViewStateEncryptionMode 并不是真正为防止 ViewState 篡改而设计的;它旨在掩盖您在 ViewState 中嵌入的任何内容。例如,如果您决定将一些关于您自己的秘密信息添加到 ViewState(例如,ViewState["secretinfo"] = "My social security number is xxx-xx-xxxx.";),任何出现并加载您的页面的用户都可以获取您的 __VIEWSTATE 字段并通过 base64 解码器运行它以找到您的社会安全号码— 当然,除非您正在加密 ViewState。

例如,here's a .aspx page I found 通过简单的 Google 搜索。查看源代码,获取 ViewState,并将其粘贴到此 base64 decoder 中。在几个丑陋的字符中,你会发现一堆纯文本。这个 ViewState 显然没有被加密(这可能不是一件坏事)。

现在,如果您是一个好奇或可能怀有恶意的人,您可能会尝试修改您在 ViewState 中找到的一些文本,将其重新编码为 base64,然后将其放回 __VIEWSTATE 字段。 (在许多浏览器中,只需打开 JS 控制台并输入 document.querySelector("[name=__VIEWSTATE]").value = "whatever your base64 text is";。)现在,当您提交表单时,页面将返回修改后的 ViewState。

这就是 EnableViewStateMac 发挥作用的地方。正如 MSDN 所指出的,此设置应始终在生产站点上启用,因为该设置旨在防止恶意人员篡改 __VIEWSTATE 字段。为了简化,它基本上计算 __VIEWSTATE 值的散列(实际上是 message authentication code)并将其与 __VIEWSTATE 一起发送。 (它嵌入在字符串的末尾,不会解码回一个漂亮的纯文本字符串。)如果您修改 __VIEWSTATE 中的某些文本,该消息将不再与 MAC 匹配,并且 .NET 将捕获并抛出在您有机会处理请求之前出现异常。

TL;DR
只要您启用了 EnableViewStateMac(您应该这样做),您就无法真正修改 __VIEWSTATE 字段。

【讨论】:

    【解决方案2】:

    您可以通过在代码隐藏中设置标签对象的 Text 属性来更改标签的视图状态。内置 ASP.NET 控件的大多数属性都由 viewstate 支持,因此设置属性将间接更改该控件的 viewstate。

    在您的 .aspx 中:

    <asp:Label id="myLabel" Text="Hi.." />
    

    在您的 .aspx.cs 中:

    myLabel.Text = "Hello";
    

    【讨论】:

    • 是的,我可以这样做,这不是我的申请要求。实际上,有人问我这个问题“我们如何修改控件的视图?”所以我试图找到这个问题的正确答案。是否可以修改控件的视图状态,如果可以,那么如何修改?
    • 如果这个问题只是为了看看你是否理解什么是视图状态,而正确的答案只是改变文本属性怎么办? ;)
    【解决方案3】:

    您不能重置 PostBack 事件的值吗?比如:

    mylabel.Text = "你好";

    【讨论】:

    • 是的,我可以这样做,这不是我的申请要求。实际上,有人问我这个问题“我们如何修改控件的视图?”所以我试图找到这个问题的正确答案。是否可以修改控件的视图状态,如果可以,那么如何修改?
    【解决方案4】:

    视图状态存储在页面上的隐藏字段中。视图状态虽然以散列格式[编码格式]存储数据,但要修改正确的值并不容易,并且会导致视图状态的回火。

    你需要修改Viewstate,你需要知道正确的编码和解码算法。

    所以不要试图修改视图状态。

    【讨论】:

    • 感谢您的回复罗米尔..!!这不是我的申请要求。实际上,有人问我这个问题“我们如何修改控件的视图?”所以我试图找到这个问题的正确答案。是否可以修改控件的视图状态,如果可以,那么如何修改?
    • 寻找微软用来存储 ViewState 的编码/解码算法。
    【解决方案5】:

    简短的回答是可以。

    要修改视图状态,您基本上必须:

    1. 反序列化视图状态
    2. 识别与标签文本关联的键/值对(此时它是一个包含键/值对的 Xml 字典)
    3. 修改
    4. 序列化视图状态

    本文对解析视图状态进行了更深入的研究。它还包括对可用于解析/解码视图状态的工具的引用:Understanding ASP.NET View State

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 2020-09-29
      • 2012-04-19
      • 1970-01-01
      • 2017-07-07
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多