例如,让我们说我有一个gridview列,它有重要的控件,
如果我让它们在常规用户上不可见,并且对管理员用户可见,那么它是否安全?
If (Requst.Servervariables.Get("LOGON_USER").Split('\\')[1] == "MyAdminUser")
{
gridview1.columns[0].visible = true;
}
答案 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;
}
}
}