例如,假设我有一个具有重要控件的 gridview 列,
如果我让它们对普通用户不可见,而对管理员用户可见,它是否安全?
If (Requst.Servervariables.Get("LOGON_USER").Split('\\')[1] == "MyAdminUser")
{
gridview1.columns[0].visible = true;
}
例如,假设我有一个具有重要控件的 gridview 列,
如果我让它们对普通用户不可见,而对管理员用户可见,它是否安全?
If (Requst.Servervariables.Get("LOGON_USER").Split('\\')[1] == "MyAdminUser")
{
gridview1.columns[0].visible = true;
}
即使可见性设置为 false,该控件也存储在 Viewstate 中。视图状态没有加密,它只是 Base-64 编码。从理论上讲,可以解析视图状态并提取值,因此它不是 100% 安全的,但是对于大多数人来说,利用这个弱点并提取值是很困难的。
对于次要的事情,这样做可能没问题,但是如果您要保护真正敏感的数据,我会找到另一种隐藏数据的方法,或者根本不将其发送给客户端。对于控件,可能会在管理员用户的代码隐藏中动态添加它,而不是将其可见性设置为 false。
当然,练习深度防御。
简单地隐藏控件被称为“默默无闻的安全性”,这根本不是什么安全性。这是一个有效的附加安全层,但您绝对不应该依赖它(例如,如果您不知道 URL,则假设您无法访问敏感信息,则隐藏指向敏感信息的链接)。如果您确实使用它来隐藏链接,您仍然需要像链接没有“隐藏”时一样小心保护这些页面。攻击者可以通过多种方式找到此类“隐藏”链接。
除了@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;
}
}
}