繁体   English   中英

Page.IsPostBack 的安全实现?

[英]A secure implementation of Page.IsPostBack?

根据我之前关于ASP.net 的默认 Page.IsPostBack 实现是否安全的问题(它不是;它可以被伪造...... HTTP 动词甚至不必是 POST,); 我刚在想? 肯定有更好的方法来实现它。 我们能想出一个 Page,IsPostBack 实现,当它是真的时? 几乎可以保证表明该页面是实际的 ASP.net 回发,如果只想进行一次安全检查(例如是否会根据用户的角色显示某些内容),这一点很重要。 并且只有在我们不处理 ASP.net 回发时才想这样做。

关于如何做到这一点,我的第一个想法是在属性中实现检查代码,因此我可以在Page_Load中编写类似这样的内容:

if (!_isPostBack)
{
    // Do security check
    if (userIsNotAuthorized)
    {
        btnViewReports.Visible = false;
        btnEditDetails.Visible = false;
        // etc.
    }
}

有没有办法安全地实施_isPostBack 也许在 ViewState 中存储一些难以或不可能通过 jerry-rig 伪造回发的东西? 随机字符串?

几年前我有一个项目,我们对代码进行了一些渗透测试。 他们指出了默认情况下IsPostback不检查 http 动词的事实。 为了解决这个问题,我创建了一个抽象的页面 class ,它有自己的IsPostback实现,它隐藏了默认的实现:

Public Class ProjectPage : System.Web.UI.Page

    public new bool IsPostBack()
    {
        return (Page.IsPostBack && Request.HttpMethod.ToUpper() == "POST");
    }

End Class

这允许您对 http 动词进行测试,但您也可以轻松扩展该方法以进行其他检查。

好的,这就是我认为的解决方案: Page.IsPostBack已经足够安全,只要启用了事件验证。 让我在下面解释我的推理,如果我有什么问题,我很乐意任何人添加评论。

为了将欺骗回发发布到 ASP.net 并触发控件的OnClick事件,启用事件验证,客户端必须发送__EVENTVALIDATION表单字段。 此字段包含一个唯一生成的字符串,它基本上告诉 ASP.net 控制该页面的回发事件可能源自哪个。 如果您尝试欺骗已设置.Visibility = false的按钮的回发,您将看到事件验证错误消息。 所以,看起来你不能直接欺骗隐藏控件的点击。

欺骗您呈现的页面上现有按钮之一的回发怎么样(即您确实有权查看/单击它)? 好吧,您可以将回发发送到页面,但您需要提交有效的__VIEWSTATE否则您只会收到“状态信息无效”错误。 为了获得有效的__VIEWSTATE ,您已经需要将页面加载为非回发,对吗? 这意味着安全检查代码将至少执行一次,隐藏适当的控件并将其记录在__VIEWSTATE中。 因此,当您发布欺骗回发时,是的,它会导致Page.IsPostBack为真,但这没关系,因为提交的__VIEWSTATE已经在之前的非回发页面加载时生成,以隐藏您应该隐藏的内容'无权访问...因此,您可以欺骗回发,但只能通过传递先前由非回发页面加载生成的__VIEWSTATE

因此,由于这些事实,只将安全检查代码放在Page.IsPostBack == false块中应该是安全的。 这必须始终运行一次,然后才能将有效的回发提交到 ASP.net 服务器。 还是我错过了什么?

cookie 是一种更好的机制来满足您的需求。 cookie 是一个只能由服务器生成的令牌,并为令牌持有者提供某些声明,例如最近登录以及拥有某些权限和/或偏好。 其中一些功能内置在 FormsAuthentication 中。 您可以实现自己的 cookie 机制,但您应该研究安全 cookie 协议,因为有几个不明显的安全注意事项。

好处是您不必在每次请求时都向数据库发送 go,您只需信任它。 这也可能是抵御某些 DoS 攻击的好策略,因为您可以将应用分层,以便应用服务器前面的专用设备也验证令牌并抛出无效请求。

如果不允许 cookies,您可以将令牌作为 url 的一部分(如 formsauth 允许的那样)或作为回发中的表单字段发送。 但是,一旦您遇到了生成适当令牌的麻烦,那么管理工作就比 cookies 恕我直言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM