CryptographicException:填充无效,无法删除,viewstate MACvalidation失败

监视我的全局exception日志这个错误似乎是不可能删除的,不pipe我做了什么,我以为我终于摆脱了它,但它又回来了。 你可以在这里看到类似的post上的错误的痕迹。

有关环境的注意事项:

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生成的隐藏字段都正确地位于页面的顶部。

首先让我们从这个事实出发, 这个错误的状态发生在PostBack上

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

所以, 有人会采取行动 ,让一个男人</s>然心动 ,通过在您的网页上“点击”某个其他search机器,或者某些黑客试图检查您的系统是否存在问题。

我有类似的问题(罕见但现有的),我终于发现人们试图破解我的网页。 (从相同的IP我和DOS攻击)

我修改了翻译视图状态的函数LoadPageStateFromPersistenceMedium() ,通过logging什么是input以及来自哪些IP …然后我开始监视这些结果并查看视图状态是由手改变的 – 或者是完全空的。

错误,我只是redirect他到同一页面…

这是我做的…

 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被放置在最后一个button上 – 即使是asp.netfind的,如果你在页面上的很多地方,或者在button附近有一些,那么这个就会到达页面的末尾。

所以,即使你看到页面顶部的视图状态,validation码在哪里? 也许这从来没有加载 – 页面损坏,太快用户点击页面?

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

为了避免这种问题,我做了一个简单的JavaScript,我不让它按下button,除非这个input已经加载!!!

还有一点意见,__EVENTVALIDATION并不总是呈现! 所以也许更安全的是不要search这个领域,如果你做出一个通用的解决scheme,但要做一个JavaScript技巧来检查整个页面是否加载,或者你认为的其他东西。

这里是我最后的jQuery解决scheme:(注意,如果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();"; } } 

你可以通过放在你的页面button附近进行testing。

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

更新

今天我在WebResource中再次login这个消息,我发现一个僵尸程序获取页面,并以小写forms包括参数在内的所有链接的字符 ,所以这是一个更多的原因,没有得到正确的编码string,并抛出Padding等消息无效,无法删除。

希望这可以帮助你更多。

对错误消息中的几个关键字find的网页的调查表明,这种types的错误是相对常见的,通常是随机的(至less在外观上),不幸的是很less包括明确的解决方法或解释…

许多类似但又不同的情况的存在可能与很多不同的体系结构和底层configuration有关,这些体系和底层configuration可能以某种方式导致密码层不能在请求页面中声明MAC(消息authentication码)的真实性:

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

围绕这些bug报告的一个比较频繁的“标记”是提及资源请求(例如WebResource.axd )。
请注意,这样的请求通常不会被logging (以免它们利用相对较less的事件膨胀日志文件大小)。 日志文件中的这种缺失以及它们经常被caching的事实(以及因此错误的相对随机且偶然的发生)可以解释这种错误的可能起源是如何“陷入困境”的。 这也表明,在试图重新创build错误时(在日志中实时跟踪等),防止Web浏览器caching(或者至less最初清除caching)可能是有用的。

总之,这里有一些想法和事情要寻找:

  • 开始logging* .axd请求
  • 尝试将这些axd请求与exception日志中的错误事件联合起来
  • 寻找具有资源引用的页面
  • 如果在农场设置中,确保所有实例使用相同的密钥(显然是在多个IIS服务器上的问题提示中提供的片段)
  • 怀疑与第三方的联系(search服务,联属计划…)的网页

希望这可以帮助 ;-)

你确定你的问题是密码相关的,而不是由过大的ViewState? 如果ViewState出现问题,可以将其封装 – 在web.config中更改pages / MaxPageStateFieldLength的值