ASP.NET Viewstate - 寻求有关支持文章的说明

时间:2013-06-01 00:56:46

标签: asp.net viewstate

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

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

  

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

这对我没有意义。为什么标签控件或任何其他永不更改且不与http请求数据相关的静态控件需要viewstate?我以为只有表单控件才会使用viewstate。有什么我想念的吗?如果标签控件使用viewstate,那就搞砸了,恕我直言。只是在寻找澄清,如果有人可以解释一下。也许它还不够晚,或者我还没有足够的啤酒。 THX!

1 个答案:

答案 0 :(得分:0)

  

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

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

我可以考虑使用viewstate的一些原因是缓存/保存/保留下一篇文章的相同数据。例如。此代码将在回发后将文本保留在文字内,而不再重新设置。

<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

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

任何人都可以阅读并更改它(如果你没有保护它)并且让我们说改变文字

"Time of start editing""<script>alert("hello there");</script>",现在在第一篇文章中,Literal将呈现脚本,这是警告你的问题。

相关问题