有一个不可见的ASP.NET控件安全吗?

时间:2012-03-27 18:06:47

标签: asp.net security gridview asp.net-controls

例如,让我们说我有一个gridview列,它有重要的控件,

如果我让它们在常规用户上不可见,并且对管理员用户可见,那么它是否安全?

If (Requst.Servervariables.Get("LOGON_USER").Split('\\')[1] == "MyAdminUser")
{
     gridview1.columns[0].visible = true;
}

2 个答案:

答案 0 :(得分:5)

即使可见性设置为false,控件也会存储在Viewstate中。视图状态未加密,只是Base-64编码。从理论上讲,it is possible to parse the viewstate and extract values,所以它并非100%安全,但大多数人都很难利用这些弱点并提取价值。

对于小事情,这可能是可以的,但是如果你要保护真正敏感的数据,我会找到另一种隐藏数据的方法,或者根本就没有它去客户端。对于控件,可以在管理员用户的代码隐藏中动态添加它,而不是将其可见性设置为false。

当然,练习深度防守。

简单地隐藏控件被称为“默默无闻的安全”,这根本不是很安全。它是一个有效的附加安全层,但您绝对不应该依赖它(隐藏敏感信息的链接,假设如果您不知道URL,则无法访问它)。如果您确实使用它来隐藏链接,那么您仍然需要像链接没有“隐藏”那样谨慎地保护这些页面。攻击者可以通过多种方式找到这种“隐藏”链接。

答案 1 :(得分:1)

除了@David的回答。您可以在RowBoundData事件中对此列进行格式化。

如果是非管理员用户,请不要将文本设置为此控件。

protected void grd_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        Label SecuredColumn = (Label)e.Row.FindControl("SecuredColumn");
        if (Request.ServerVariables.Get("LOGON_USER").Split('\\')[1] == "MyAdminUser")
        {
            SecuredColumn.Text = ((YourClass)e.Row.DataItem).YourPropertyName;
            SecuredColumn.Visible = true;
        }
        else
        {
            SecuredColumn.Visible = false;
        }
    }
}