拥有不可见的ASP.NET控件是否安全



例如,假设我有一个gridview列,它有重要的控件

如果我让它们在普通用户上不可见,而在管理员用户上可见,这安全吗?

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

即使可见性设置为false,控件也存储在Viewstate中。视图状态没有加密,它只是Base-64编码的。从理论上讲,解析视图状态并提取值是可能的,因此它不是100%安全的,但大多数人很难利用这个弱点提取值。

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

当然,还要练习深度防守。

简单地隐藏控件被称为"模糊安全",这根本不安全。它是一个有效的额外安全层,但你绝对不应该依赖它(例如,如果你不知道URL,就可以隐藏敏感信息的链接,假设你无法访问它)。如果你真的用它来隐藏链接,你仍然需要像保护那些链接没有"隐藏"一样小心。攻击者可以通过多种方式找到此类"隐藏"链接。

除了@David answer。您可以在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;
        }
    }
}

最新更新