Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Page.IsPostBack的安全实现?_C#_Asp.net_Security_Postback - Fatal编程技术网

C# Page.IsPostBack的安全实现?

C# Page.IsPostBack的安全实现?,c#,asp.net,security,postback,C#,Asp.net,Security,Postback,关于ASP.net的默认Page.IsPostBack实现是否安全(它不是;它可能是伪造的……HTTP动词甚至不必是POST!),我在想;肯定有更好的方法来实施它吗?我们能想出一个Page.IsPostBack实现吗?如果它是真的,几乎可以保证表明该页面是实际的ASP.net回发?如果只想执行一次安全检查(例如,根据用户的角色,某些内容是否会出现),并且只想在不处理ASP.net回发的情况下执行,这一点很重要 关于如何实现这一点,我的第一个想法是在属性中实现检查代码,这样我就可以在Page\u

关于ASP.net的默认Page.IsPostBack实现是否安全(它不是;它可能是伪造的……HTTP动词甚至不必是POST!),我在想;肯定有更好的方法来实施它吗?我们能想出一个Page.IsPostBack实现吗?如果它是真的,几乎可以保证表明该页面是实际的ASP.net回发?如果只想执行一次安全检查(例如,根据用户的角色,某些内容是否会出现),并且只想在不处理ASP.net回发的情况下执行,这一点很重要

关于如何实现这一点,我的第一个想法是在属性中实现检查代码,这样我就可以在
Page\u Load
中编写类似的内容:

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

是否有一种方法可以安全地实现
\u isPostBack
?也许在ViewState中存储一些很难或不可能伪造回发的内容?随机字符串?

cookie是一种更好的机制,可以满足您的需要。cookie是一个令牌,它只能由服务器生成,并为令牌持有者提供某些声明(如最近登录)以及某些权限和/或首选项的担保。其中一些功能内置于FormsAuthentication中。您可以实现自己的cookie机制,但是您应该研究安全cookie协议,因为有几个不明显的安全考虑因素

这样做的好处是,您不必在每次请求时都访问数据库,只需信任它即可。这也可能是抵御某些DoS攻击的一个好策略,因为您可以对应用程序进行分层,以便应用程序服务器前面的专用设备也可以验证令牌并抛出无效请求


如果不允许使用cookie,您可以按照formsauth的允许,将令牌作为url的一部分发送,或者作为回发中的表单字段发送。但是,一旦你遇到了生成正确令牌的麻烦,那么管理cookies的工作就比管理cookies要多,IMHO。

几年前我有一个项目,我们对代码进行了一些渗透测试。他们指出,默认情况下,
IsPostback
不会检查http动词。为了解决这个问题,我创建了一个抽象页面类,它有自己的
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
事件,在启用事件验证的情况下,客户端必须发送
\u EVENTVALIDATION
表单字段。此字段包含一个唯一生成的字符串,该字符串基本上告诉ASP.net控制该页回发事件的源。如果您试图为设置了
.Visibility=false
的按钮伪造回发,您将看到一条事件验证错误消息。因此,看起来您无法直接在隐藏控件上单击鼠标

如何欺骗已呈现页面上某个现有按钮的回发(即,您确实拥有查看/单击该按钮的权限)?好的,您可以将回发发送到页面,但是您需要提交一个有效的
\u VIEWSTATE
,否则您只会得到一个“state information invalid”错误。为了获得有效的
\uuu VIEWSTATE
,您已经需要将页面作为非回发加载,对吗?这意味着安全检查代码将至少执行一次,隐藏相应的控件并将其记录在
\uuu VIEWSTATE
中。因此,当您发布欺骗回发时,是的,它将导致
Page.IsPostBack
为真,但这并不重要,因为在上一次非回发页面加载时已生成提交的
\u视图状态
,以隐藏您无权访问的内容。。。因此,您可以伪造回发,但只能通过传递以前由非回发页面加载生成的
\u VIEWSTATE
来实现


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

您是在问安全方面的“几乎保证”?这毫无意义。它要么安全,要么不安全。“几乎”与“不安全”相同。我的意思是,在RSA加密“几乎安全”的上下文中,“几乎保证”;从理论上讲,这可能是野蛮的强迫,或者你可以“侥幸”猜到某人的钥匙,但这是难以置信的不可能或困难。你无法相信来自客户的任何东西。只要重新设计您的逻辑,您就拥有了会话对象。@当然,您不能信任来自客户机的东西;这就是这个问题的重点。我们能想出一个机制,让我们知道这是一个客户端的帖子,之前加载了页面,因此必须将其发回?当然,要做到这一点,最明显的方法是在客户端首次加载页面时向其提供一些信息,该页面必须在随后的回发中提供给我们。+1,@Henk。是的,你必须非常明确你的安全目标。所以在ASP.net中,最好的方法是使用会话吗?这就是cookie的ASP.net表示形式。为你的问题引入一种看似可靠的通用方法。我不知道ASP.Net FormsAuth是否有这些好处,但几年前我在C#中成功地实现了它们的确切协议(使用.Net加密库),没有太多麻烦。