Jez*_*Jez 5 c# asp.net security postback
根据我之前的问题,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.
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法安全地实施_isPostBack?也许在ViewState中存储一些难以或不可能进行假冒回传的东西?随机字符串?
好的,这就是我认为的解决方案:只要启用事件验证, Page.IsPostBack就已经足够安全了。让我在下面解释我的推理,如果我有什么错误,我很乐意任何人添加评论。
为了将欺骗回发发布到 ASP.net 并触发控件的OnClick事件,在启用事件验证的情况下,客户端必须发送__EVENTVALIDATION表单字段。该字段包含一个唯一生成的字符串,该字符串基本上告诉 ASP.net 控制该页面的回发事件的来源。如果您尝试对已设置的按钮进行欺骗回发.Visibility = false,您将看到事件验证错误消息。因此,看起来您无法直接欺骗隐藏控件的点击。
欺骗您已呈现的页面上现有按钮之一的回发(即您确实有权查看/单击它)怎么样?好吧,您可以将回发发送到页面,但您需要提交有效的信息__VIEWSTATE,否则您只会收到“状态信息无效”错误。为了获得有效的__VIEWSTATE,您已经需要将页面加载为非回发,对吧?这意味着安全检查代码将至少执行一次,隐藏适当的控件并将其记录在__VIEWSTATE. 因此,当您发布欺骗回发时,是的,它会导致Page.IsPostBack为真,但这并不重要,因为提交的内容__VIEWSTATE已经在之前的非回发页面加载中生成,以隐藏您不应该访问的内容所以,您可以欺骗回发,但只能通过传递__VIEWSTATE先前由非回发页面加载生成的回发。
因此,由于这些事实,仅将安全检查代码放入块中应该是安全的Page.IsPostBack == false。在将有效的回发提交到 ASP.net 服务器之前,必须始终运行一次。或者我错过了什么?