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

前端之家收集整理的这篇文章主要介绍了c# – CryptographicException:填充无效,无法删除,并且viewstate MAC的验证失败前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
监控我的全局异常日志这个错误似乎是不可能删除,无论我做什么,我以为我终于摆脱了它,但它又回来了.您可以在 similar post here上看到错误的痕迹.

关于环境的注意事项:

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

已采取的步骤:

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

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

  1. protected override void OnInit(EventArgs e)
  2. {
  3. const string viewStateKey = "big key value";
  4.  
  5. Page.ViewStateUserKey = viewStateKey;
  6. }

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

解决方法

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

我也必须说,我已经做了所有的事情,每个人都建议做,以避免这个问题.而且我有单机,但是两个运行相同页面的池.

所以有人做一个动作,一个人,以太网,一些其他搜索机通过’点击’你的页面,或一些黑客尝试检查您的系统的问题…

我有类似的问题(很少但现有的),我终于发现人们试图攻击我的网页. (来自同一个IP我有和DOS攻击)

修改了翻译视图状态的LoadPageStateFromPersistenceMedium()函数,并通过记录输入的具体内容和从什么IP …开始监视这些结果,看到视图状态是手动更改的,或者完全是空的.

错误的我只是把他重定向到同一页面

这是我做的…

  1. public abstract class BasePage : System.Web.UI.Page
  2. {
  3. protected override object LoadPageStateFromPersistenceMedium()
  4. {
  5. try
  6. {
  7. .. return the base,or make here your decompress,or what ever...
  8. return base.LoadPageStateFromPersistenceMedium();
  9. }
  10. catch (Exception x)
  11. {
  12. string vsString = Request.Form[__VIEWSTATE];
  13. string cThePage = Request.RawUrl;
  14.  
  15. ...log the x.ToString() error...
  16. ...log the vsString...
  17. ...log the ip coming from...
  18. ...log the cThePage...
  19.  
  20. // check by your self for local errors
  21. Debug.Fail("Fail to load view state ! Reason:" + x.ToString());
  22. }
  23.  
  24. // if reach here,then have fail,so I reload the page - maybe here you
  25. // can place somthing like ?rnd=RandomNumber&ErrorId=1 and show a message
  26. Responce.Redirect(Request.RawUrl,true);
  27.  
  28. // the return is not used after the redirect
  29. return string.Empty;
  30. }
  31. }

第二个原因

现在还有一个原因可能会发生,原因是因为在__EVENTVALIDATION加载之前有一个人点击你的页面.

这个eventValidation被放在最后一个按钮上 – 即使asp.net找到了,如果你在页面上的许多地方或者按钮附近都有一些按钮,那么这个到页面的末尾.

所以即使你看到页面顶部的viewstate,那么验证?也许这没有加载 – 页面损坏?用户点击页面太快?

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

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

再一次评论,__EVENTVALIDATION并不总是呈现!所以如果你做一个通用的解决方案,那么可能更安全,不要搜索这个领域,而是要做一个javascript技巧来检查整个页面是否被加载,或者你认为的其他内容.

这是jQuery的最终解决方案(请注意,如果eventvalidation存在,请检查pageLoad!).我把这放在我的主页上.

  1. <script language="javascript" type="text/javascript">
  2. function AllowFormToRun()
  3. {
  4. var MyEventValidation = $("#__EVENTVALIDATION");
  5.  
  6. if(MyEventValidation.length == 0 || MyEventValidation.val() == ""){
  7. alert("Please wait for the page to fully loaded.");
  8. return false;
  9. }
  10.  
  11. return true;
  12. }
  13. </script>
  14.  
  15. protected void Page_Load(object sender,EventArgs e)
  16. {
  17. // I do not know if Page can be null - just in case I place it.
  18. if (Page != null && Page.EnableEventValidation)
  19. {
  20. Form.Attributes["onsubmit"] = "return AllowFormToRun();";
  21. }
  22. }

您可以通过在页面的按钮附近放置测试.

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

更新

今天我再次看到WebResource的这个消息,我发现是一个机器人获取页面,并使所有字符在小写的链接,包括参数,所以这是一个更多的原因,没有得到正确的编码字符串,并抛出一个像Padding这样的消息是无效的,不能被删除.

希望这能帮助你更多.

猜你在找的C#相关文章