【发布时间】:2025-12-03 04:15:01
【问题描述】:
我只是在阅读有关 Web 表单安全性以及为什么不应该只在第一个页面加载时进行安全检查的阅读,因为有可能欺骗回发并绕过此检查:
if (!IsPostBack)
{
if (IsUserInRole("SomeRole"))
{
// do something
}
}
然后我想,如果标记默认隐藏某些东西,而安全检查只是启用它,那仍然是真的吗?
标记:
<asp:Button ID="btnUpdate" runat="server" Text="Update" Visible="false" />
代码隐藏:
if (!IsPostBack)
{
if (IsUserInRole("SomeRole"))
{
btnUpdate.Visible = true;
}
}
的想法是,在第一个页面加载时,如果有人有权查看更新按钮,他们可以,并且可见性状态将保存在 ViewState 中以供后续回发,因此每次都检查它是多余的。即使有人设法欺骗回发,他们仍然看不到更新按钮,因此他们一无所获。
所以问题是:是否有人不仅可以欺骗回发,还可以成功修改 ViewState 以便他们可以看到他们不应该看到的东西?如果是,似乎我们必须更改上面的代码隐藏以不使用 IsPostBack 检查并处理这两种情况,无论标记中的默认值是什么:
if (IsUserInRole("SomeRole"))
{
btnUpdate.Visible = true;
}
else
{
btnUpdate.Visible = false;
}
但这似乎有点矫枉过正。诚然,如果您将其重写为:
btnUpdate.Visible = IsUserInRole("SomeRole");
那么,这真的有必要吗?
【问题讨论】:
-
好吧,你应该检查按钮的点击事件(在它实际做某事之前)。
-
好点。模拟按钮单击事件比修改 ViewState 以查看您不应该看到的按钮要容易得多。如果有人确实成功修改了 ViewState,那么在 click 事件中进行检查就无关紧要了。
-
如果您担心篡改,ViewState 默认会经过哈希处理 (
EnableViewStateMac)。见:msdn.microsoft.com/library/ms972976.aspx#viewstate_topic12