CryptographicException:填补为无效,且不能以除去和验证的视图状态MAC失败
-
10-07-2019 - |
题
监控我的全球例外日志的这一错误似乎是不可能消除无论我做什么,我以为我终于摆脱了它,但是它又回来了。你可以看到一个施特拉克丝的错误 类似的职位在这里.
注意到有关的环境:
IIS6.0,.净3.5SP1 单服务器 ASP。网应用程序
采取步骤:
<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 产生的隐藏的领域是正确的。
解决方案
首先让由以下事实,即的开始视图状态的此错误在回发发生强>
此外,我必须说的我已经做了所有,每一个建议要做的事情来避免这个问题。我有单个机器,但2运行的相同页面池。
所以一个人做一个动作,醚男人,醚通过在网页上“点击”,或一些黑客试图检查您的系统是否存在问题?
一些其他搜索机我有类似的问题(罕见的,但现有的),我终于发现,人们试图破解测试我的网页。 (来自同一IP我有和DoS攻击)
我修改功能的LoadPageStateFromPersistenceMedium()是翻译的视图状态,并通过登录究竟是输入查看,并从什么IPS ......然后我就开始监控这些结果,并看到该视图状态用手改变 - 或是完全空
在错误我只是他重定向到同一页面...
下面是我做的......
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最终的解决方案:(!注意,我在pageLoad的检查,如果存在eventvalidation)。我已经此放置在我的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什么,我发现的是一个机器人获取的页面和点击链接所有字符小写,包括参数,所以这是一个理由没有得到正确的编码串,并抛出一个消息例如填充是无效的,不能删除。强>
希望这有助于你。
其他提示
一项调查的网页找到几个关键字的错误信息表明,这个 类型 错误是比较常见,通常是随机的(至少在外)并且不幸的是,很少包含一个明确的工作-或解释...
存在着许多类似但不同的情况下可能是绑在很多不同的架构和潜在的配置,它可以以某种方式导致无法加密层声称的真实性MAC(Message Authentication Codes)在请求的网页:
- 服务器的农场安装
- 跨域/联合网页
- 第三方部件库和这样的
- 实际ASP程序的逻辑(的过程)
一个相对频繁的"标记",围绕这些错误报告是提的资源要求(例如。 Web.axd).
注意,这种请求往往是 不记录 (以免他们膨胀的记录文件的大小活动的相对小的兴趣)。这没有从记录文件和事实,他们往往是缓存(和因此相对随机并不经常发生的错误)可以解释这怎么可能来源的的错误去"下的雷达"。这也表明,在试图重建的错误,(同时跟踪在日志中,在真正的时间等等)可能是有用的,以防止网络浏览器从高速缓存(或少于清除缓的最初).
总之,这里有一些想法,并寻找的东西:
- 开始记录*。axd请求
- 尝试和共同与这种axd请求,与错误的事件中的例外日志
- 看网页资源的参考文献
- 如果在一个农场设置,确保所有实例中使用相同的密钥(显然是该段中提供的问题暗示在多IIS服务器)
- 可疑的网页第3次缔约方联系(搜索服务,联盟计划...)
希望这有助于;-)
你确定你的问题是密码学相关的,而不是过大的ViewState造成的? 如果ViewState中的问题,您可以大块它 - 改变页面的价值/ MaxPageStateFieldLength在web.config中