1

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

如果我让它们对普通用户不可见,而对管理员用户可见,它是否安全?

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

2 回答 2

5

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

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

当然,练习深度防御。

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

于 2012-03-27T18:09:02.187 回答
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;
        }
    }
}
于 2012-03-27T18:21:28.100 回答