当前位置:  开发笔记 > 编程语言 > 正文

CryptographicException:填充无效,无法删除,并且viewstate MAC验证失败

如何解决《CryptographicException:填充无效,无法删除,并且viewstateMAC验证失败》经验,为你挑选了1个好方法。

监视我的全局异常日志这个错误似乎无法删除,无论我做什么,我以为我终于摆脱它但它又回来了.您可以在此处查看类似帖子上的错误痕迹.

关于环境的说明:

IIS 6.0,.NET 3.5 SP1 单服务器 ASP.NET应用程序

已采取的步骤:

  
    

在我的所有页面的页面基础中

  protected override void OnInit(EventArgs e)
  {
    const string viewStateKey = "big key value";

    Page.ViewStateUserKey = viewStateKey;
  }

同样在页面的源代码中,我可以看到所有ASP.NET生成的隐藏字段都正确地位于页面顶部.



1> Aristos..:

首先让我们从事实开始,这个视图状态错误发生在PostBack上.

另外,我必须说我已经完成了每个人建议做的所有事情来避免这个问题.我有一台机器,但有两个运行相同Pages的池.

所以有人通过"点击"你的页面来做一个动作,一个人,一个其他搜索机器,或者一些黑客试图检查你的系统是否有问题......

我有类似的问题(罕见但现有的),我终于发现人们试图破解测试我的页面.(来自我所拥有的相同IP和dos攻击)

我修改了翻译视图状态的函数LoadPageStateFromPersistenceMedium(),并通过记录输入的确切内容以及从哪些IP ...然后我开始监视这些结果并看到视图状态是手动更改 - 或者是完全为空.

出错时我只是将他重定向到同一页面......

这就是我做的......

public abstract class BasePage : System.Web.UI.Page
{
    protected override object LoadPageStateFromPersistenceMedium()
    {
        try
        {
            .. return the base, or make here your decompress, or what ever...
            return base.LoadPageStateFromPersistenceMedium();            
        }
        catch (Exception x)
        {
            string vsString = Request.Form[__VIEWSTATE];
            string cThePage = Request.RawUrl;

            ...log the x.ToString() error...
            ...log the vsString...
            ...log the ip coming from...
            ...log the cThePage...

        // check by your self for local errors
            Debug.Fail("Fail to load view state ! Reason:" + x.ToString());
        }

        // if reach here, then have fail, so I reload the page - maybe here you
        // can place somthing like ?rnd=RandomNumber&ErrorId=1 and show a message
        Responce.Redirect(Request.RawUrl, true);        

        // the return is not used after the redirect
        return string.Empty;
    }    
}

第二个原因

现在还有一个原因可以解决这个问题,原因是因为在加载__EVENTVALIDATION之前有一次点击页面.

这个eventValidation放在最后一个按钮上 - 甚至是asp.net找到的,如果你在页面上的许多地方或按钮附近有一些它们,那么这将转到页面的末尾.

因此,即使您在页面顶部看到视图状态,验证位置在哪里?也许这从未加载 - 页面损坏?用户点击页面太快?


为了避免这种问题,我做了一个简单的javascript我不会让它按下按钮,除非这个输入已被加载!!!

还有一条评论,__ EVENTVALIDATION并不总是存在!如果你做一般解决方案,那么可能更安全的不是搜索这个字段,而是制作一个javascript技巧来检查是否加载了整个页面,或者你认为的其他内容.

这是我对jQuery的最终解决方案:(注意我检查PageLoad是否存在eventvalidation!).我将它放在我的MasterPages上.



protected void Page_Load(object sender, EventArgs e)
{
    // I do not know if Page can be null - just in case I place it.
    if (Page != null && Page.EnableEventValidation)
    {
        Form.Attributes["onsubmit"] = "return AllowFormToRun();";
    }
}

您可以通过在页面按钮附近延迟进行测试.

<% System.Threading.Thread.Sleep(5000); %>

更新

今天我再次在日志中看到WebResource的这条消息,我发现机器人获取页面并以小写形式在链接上创建所有字符,包括参数,所以这是获得正确编码字符串的另一个原因,并抛出像Padding这样的消息是无效的,无法删除.

希望这能帮到你更多.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有