【问题标题】:Does having an invisible ASP.NET control secure?拥有不可见的 ASP.NET 控件是否安全?
【发布时间】:2012-04-11 07:29:22
【问题描述】:

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

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

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

【问题讨论】:

  • 有一种检查方法。查看发出的 HTML,看看是否有任何东西。如果某些内容的样式只是设置为不显示,那么所有人都可以看到它。如果没有内容被渲染,那么隐形措施本身就是阻止用户看到它。 (在后一种情况下我不敢说“安全”,因为在这个问题的上下文之外可能有许多其他因素使整个系统不安全。)

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


【解决方案1】:

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

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

当然,练习纵深防御。

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

【讨论】:

  • 对 Viewstate 的呼吁很好,我已经忘记了。 (很高兴知道我没有看到它足够长的时间以至于我能够忘记它。)这是一个很好的理由,我通常建议为不同的用户上下文设置不同的页面。用户控件和其他可重用元素可以在这些页面上动态组合,但我喜欢将授权作为资源级别(页面、操作等)的关注点。
【解决方案2】:

除了@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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2014-03-29
    • 2011-08-11
    • 1970-01-01
    • 2015-02-12
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多