gpt4 book ai didi

c# - CryptographicException:填充无效且无法删除并且 View 状态 MAC 验证失败

转载 作者:太空狗 更新时间:2023-10-29 17:30:48 25 4
gpt4 key购买 nike

监控我的全局异常日志这个错误似乎无论我做什么都无法消除,我以为我终于摆脱了它但它又回来了。您可以在 similar post here 上看到错误的痕迹.

环境注意事项:

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

最佳答案

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

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

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

我有类似的问题(罕见但存在的问题),我终于发现人们试图对我的页面进行黑客测试。 (来 self 拥有的相同 IP 和 dos 攻击)

我修改转换 View 状态的函数LoadPageStateFromPersistenceMedium(),并通过记录输入的确切内容以及来自哪些IP...然后我开始监控这些结果并看到 View 状态被手动更改 - 或者完全是空的。

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

这是我做的...

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 找到的,如果你在页面上的许多地方或按钮附近有一些它们,那么它会转到页面的末尾。

所以即使你在页面顶部看到了viewstate,Validation在哪里???也许这从未加载过 - 页面损坏?用户点击页面的速度太快?

<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.

希望这对你有更多帮助。

关于c# - CryptographicException:填充无效且无法删除并且 View 状态 MAC 验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1821243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com