9

监控我的全局异常日志,无论我做什么,这个错误似乎都无法消除,我以为我终于摆脱了它,但它又回来了。您可以在此处的类似帖子中看到错误的轨迹。

环境注意事项:

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

已经采取的步骤:

  <system.web>
    <machineKey validationKey="big encryption key"
      decryptionKey="big decryption key"
      validation="SHA1" decryption="AES" />

在我所有页面的页面库中

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

    Page.ViewStateUserKey = viewStateKey;
  }

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

4

3 回答 3

23

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

另外我必须说,我已经做了每个人建议做的所有事情来避免这个问题。而且我有单台机器,但有 2 个运行相同页面的池。

因此,有人通过“单击”您的页面来执行操作,以太人,以太其他搜索机器,或者某些黑客试图检查您的系统是否存在问题......

我有类似的问题(罕见但存在的问题),我终于发现人们试图对我的页面进行黑客测试。(来自我拥有的同一个 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 找到的那个按钮,如果你在页面上的很多地方或者按钮附近有一些按钮,那么它会转到页面的末尾。

所以即使你看到页面顶部的视图状态,验证在哪里???也许这从未加载过 - 页面损坏?,用户点击页面太快?

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" ... >

为避免此类问题,我制作了一个简单的 javascript,除非已加载此输入,否则我不会让它按下按钮!!!。

还有一条评论,__EVENTVALIDATION 并不总是存在!因此,如果您制定通用解决方案,则不要搜索此字段可能更安全,而是制作一个 javascript 技巧来检查是否已加载整个页面或您认为的其他内容。

这是我使用 jQuery 的最终解决方案:(请注意,如果 eventvalidation 存在,我会检查 PageLoad!)。我把它放在我的 MasterPages 上。

<script language="javascript" type="text/javascript">
    function AllowFormToRun()
    {
        var MyEventValidation = $("#__EVENTVALIDATION");

        if(MyEventValidation.length == 0 || MyEventValidation.val() == ""){
            alert("Please wait for the page to fully loaded.");
            return false;
        }

        return true; 
    }       
</script>

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 is invalid and cannot be removed 之类的消息。

希望这对您有更多帮助。

于 2010-03-31T09:38:20.650 回答
4

对包含错误消息中的几个关键字的网页进行的调查表明,这种类型的错误相对常见,通常是随机的(至少在外观上),不幸的是很少包含明确的解决方法或解释......

许多相似但不同的情况的存在可能与许多不同的架构和底层配置有关,这可能会导致加密层无法在请求页面中断言 MAC(消息身份验证代码)的真实性:

  • 服务器场设置
  • 跨域/联合页面
  • 第三方小部件库等
  • 实际的 ASP 程序逻辑(当然)

围绕这些错误报告的一个相对频繁的“标记”是提及资源请求(例如WebResource.axd)。
请注意,此类请求通常不会被记录(以免它们因相对不感兴趣的事件而增加日志文件的大小)。日志文件中的这种缺失以及它们经常被缓存的事实(因此错误的相对随机和不经常发生)可以解释错误的这种可能起源如何“在雷达之下”。这也表明,在尝试重新创建错误时(同时在日志中进行实时跟踪等),防止 Web 浏览器缓存(或至少最初清除缓存)可能很有用。

简而言之,这里有一些想法和需要寻找的东西:

  • 开始记录 *.axd 请求
  • 尝试将此类 axd 请求与异常日志中的错误事件关联起来
  • 查找具有资源引用的页面
  • 如果在农场设置中,请确保所有实例都使用相同的密钥(显然问题提示中提供的片段在多个 IIS 服务器上)
  • 对带有 3rd 方关联的页面(搜索服务、联属网络营销计划......)持怀疑态度

希望这可以帮助 ;-)

于 2010-03-31T04:22:50.900 回答
2

您确定您的问题与密码学有关,而不是由过大的 ViewState 引起的吗?如果 ViewState 是问题所在,您可以对其进行分块 - 在 web.config 中更改 pages / MaxPageStateFieldLength 的值

于 2010-03-25T21:36:06.940 回答