2012-03-27 39 views
1

例如,假设我有一个包含重要控件的gridview列,有一个隐形的ASP.NET控件安全吗?

如果我使它们在普通用户中不可见并且对管理员用户可见,是否安全?

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

有一种方法来检查。看看发出的HTML,看看有没有什么。如果有内容只是样式不显示,那么它可供所有人查看。如果没有呈现内容,则隐身措施本身会阻止用户看到它。 (在后一种情况下,我毫不犹豫地说“安全”,因为在这个问题的范围之外可能有其他任何因素使得整个系统不安全。) – David 2012-03-27 18:09:09

回答

5

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

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

当然,练习纵深防御。

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

+0

Viewstate上的良好通话,我已经忘记了这一点。 (很高兴知道我没有看到它足够长,以至于我能够忘记它。)这是一个很好的理由,以我平常的建议为不同的用户环境提供不同的页面。用户控件和其他可重用元素可以在这些页面上动态组合,但我喜欢将授权作为资源级别(页面,操作等)关注。 – David 2012-03-27 18:13:18

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; 
     } 
    } 
}