跟随我的previous question关于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中存储一些东西对于曾傑瑞来说很难或不可能伪造回发?随机字符串?
发布于 2011-06-14 19:40:25
好吧,下面是我认为的解决方案:只要启用了事件验证,Page.IsPostBack就已经足够安全了。让我在下面解释我的推理,如果我弄错了,我很乐意让任何人添加评论。
为了在启用事件验证的情况下将欺骗回发发送到ASP.net并触发控件的OnClick事件,客户端必须发送__EVENTVALIDATION表单域。此字段包含一个唯一生成的字符串,它基本上告诉ASP.net该页的回发事件可能来自哪个控件。如果您试图欺骗设置了.Visibility = false的按钮的回发,您将看到一条事件验证错误消息。所以,看起来你不能直接欺骗一个隐藏控件的点击。
假冒你已经呈现的页面上的一个现有按钮的回发(即。您是否拥有查看/单击它的权限?你可以将回发发送到页面,但是你需要提交一个有效的__VIEWSTATE,否则你会得到一个“状态信息无效”的错误。为了拥有一个有效的__VIEWSTATE,您已经需要将页面作为非回发加载,对吧?这意味着安全检查代码将至少执行一次,隐藏适当的控件并将其记录在__VIEWSTATE中。所以,当你发布欺骗回发时,是的,它会导致Page.IsPostBack为真,但这并不重要,因为提交的__VIEWSTATE将在上一次非回发页面加载时生成,以隐藏您不应该访问的内容……因此,您可以欺骗回发,但只能通过传递以前由非回发页加载生成的__VIEWSTATE来实现。
因此,由于这些事实,只将安全检查代码放在Page.IsPostBack == false块中应该是安全的。在将有效回发提交到ASP.net服务器之前,必须始终运行一次。还是我错过了什么?
发布于 2011-06-13 19:21:40
几年前我有一个项目,我们对代码做了一些渗透测试。他们指出,在默认情况下,IsPostback不会检查http动词。为了解决这个问题,我创建了一个抽象的页面类,它有自己的IsPostback实现,它隐藏了默认的实现:
Public Class ProjectPage : System.Web.UI.Page
public new bool IsPostBack()
{
return (Page.IsPostBack && Request.HttpMethod.ToUpper() == "POST");
}
End Class这允许您对http谓词进行测试,但您也可以很容易地扩展该方法以执行其他检查。
发布于 2011-06-13 19:15:38
cookie是满足您需求的一种更好的机制。cookie是只能由服务器生成的令牌,并且为令牌的持有者担保某些声明,诸如最近已经登录并且具有某些许可和/或偏好。其中一些功能内置于FormsAuthentication中。您可以实现自己的cookie机制,但您应该研究安全cookie协议,因为有几个不明显的安全考虑因素。
好处是,您不必在每次请求时都访问数据库,您只需信任它即可。这也可能是抵御某些DoS攻击的好策略,因为您可以对应用程序进行分层,以便应用程序服务器前面的专用设备也可以验证令牌并抛出无效请求。
如果不允许cookie,您可以将令牌作为url的一部分发送,就像formsauth允许的那样,或者作为回发中的表单字段。但是,一旦你经历了生成适当令牌的麻烦,那就比管理cookie要做更多的工作。
https://stackoverflow.com/questions/6328618
复制相似问题