【问题标题】:ASP.NET Viewstate - seeking clarification about a support articleASP.NET Viewstate - 寻求有关支持文章的说明
【发布时间】:2025-12-05 21:45:01
【问题描述】:

只是想看看是否有人可以进一步解释。

在 microsoft.com 上的 support article 829743 中,他们说:

如果关闭视图状态 MAC 功能,然后将视图状态用于不进行 HTML 编码的控件(例如 Label 控件),攻击者可以篡改视图状态数据并将任意数据放入视图中状态。这些任意数据被解码,然后由控件在呈现发布的页面时使用。因此,除非您努力阻止攻击,否则攻击者可以将脚本注入应用程序。例如,攻击者可以解码数据,将脚本注入到标签控件所在的数据中,然后从网站链接到它。任何单击该链接的人都将成为脚本注入攻击的受害者,该攻击可能会窃取他们的身份验证 cookie 或会话 ID。该脚本还可以让攻击者更改使用视图状态的控件的状态数据,从而可能发生特定于应用程序的攻击。

这对我来说毫无意义。为什么标签控件或任何其他从不更改且不与 http 请求数据交互的静态控件需要视图状态?我认为只有表单控件会使用视图状态。有什么我想念的吗?如果标签控件使用视图状态,那就搞砸了,恕我直言。只是寻找澄清,如果有人可以阐明。也许还不够晚,或者我还没有喝足够的啤酒。谢谢!

【问题讨论】:

    标签: asp.net viewstate


    【解决方案1】:

    为什么标签控件或任何其他静态控件不会 更改且不涉及 http 请求数据,需要 viewstate 吗?

    首先,viewstate 具有 Literal、Label 和其他控件并默认使用它,除非您使用 EnableViewState="false" 为该控件关闭它。

    我能想到使用视图状态的一些原因是缓存/保存/保留相同的数据以供下一次回帖使用。例如。此代码将在回发后将文本保留在文字中,而无需再次设置。

    <asp:Literal runat="server" EnableViewState="true" ID="txtLiterar">
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            txtLiterar.Text = "Time of start editing:" + DateTime.Now.ToString();
        }
    }
    

    回发后控件将保持第一个初始值。

    为什么 EnableViewState 在默认情况下是打开的,好吧,您可以将控件视为您在代码中设置数据的变量,并且您需要在回发后再次拥有它。否则为什么要使用控件?直接在页面上输入。

    另一方面,如果您了解自己的工作以及它们的工作原理,您可以关闭其中大多数的视图状态 - 并在回帖中再次设置它们。

    In this answer I have write 更多关于视图状态以及最需要的位置:How I can deactivate ViewState without Control problems

    现在让我们回到真正的问题,即安全性。
    如果关闭视图状态的验证,现在用于 Literal 的文本也会保存在视图状态中。

    任何人都可以阅读并更改它(如果您没有保护它)并且可以说更改文本

    "Time of start editing",到"&lt;script&gt;alert("hello there");&lt;/script&gt;",现在在第一次回帖时,Literal 将呈现脚本,这是警告您的问题。

    【讨论】:

    • 谢谢,大卫!这种观点有助于澄清它!我倾向于专注于在我的 Web 应用程序中提供 HTTP 请求,而不是关注 .NET 的(我认为是臃肿的)来龙去脉。因此,我的困惑。我之前没有将其视为攻击媒介,没有从 .NET 的角度研究控件如何获得其价值。再次感谢!
    • @Scott 看看图标上方的文字,Aristos 正在回答,David 纠正了一个小字体错误。
    最近更新 更多