【问题标题】:Web Forms: Doing page level security checks in IsPostBackWeb 表单:在 IsPostBack 中进行页面级安全检查
【发布时间】: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

标签: asp.net security webforms


【解决方案1】:

我不确定您的应用程序做了什么,但从这个应用程序的最初声音来看,需要采取更多的安全措施。

OWASP 有个不错的.Net Security Cheat Sheet

如果您正在查看可以在页面上执行的不同操作,就像@EdSF 所说的那样,并在事件开始时进行重新验证检查。

在 Web 表单中实现的另一个简单方法是针对跨站点请求伪造 (CSRF) 的检查。我有一个演示,在该演示中,我成功地在启用了视图状态 MAC 并加密了视图状态的 Web 表单页面上执行了 CSRF。

要了解有关各种漏洞和预防措施的更多信息,请查看OWASP 2013 Top 10

【讨论】: