Web窗体:在IsPostBack中执行页面级安全性检查

时间:2014-04-09 18:50:47

标签: asp.net security webforms

我刚刚阅读了一些关于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");

所以,这真的有必要吗?

1 个答案:

答案 0 :(得分:0)

我不确定你的应用程序是做什么的,但从这个应用程序的初始声音中,需要采取更多的安全措施。

OWASP有一个很好的.Net Security Cheat Sheet

如果您正在查看可以在页面上执行的不同操作,例如@EdSF表示并在事件开始时执行重新验证检查。

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

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