Chr*_*sic 9 c# asp.net cryptographicexception unhandled-exception
监视我的全局异常日志这个错误似乎无法删除,无论我做什么,我以为我终于摆脱它但它又回来了.您可以在此处查看类似帖子上的错误痕迹.
关于环境的说明:
IIS 6.0,.NET 3.5 SP1 单服务器 ASP.NET应用程序
已采取的步骤:
<system.web>
<machineKey validationKey="big encryption key"
decryptionKey="big decryption key"
validation="SHA1" decryption="AES" />
Run Code Online (Sandbox Code Playgroud)
在我的所有页面的页面基础中
protected override void OnInit(EventArgs e)
{
const string viewStateKey = "big key value";
Page.ViewStateUserKey = viewStateKey;
}
Run Code Online (Sandbox Code Playgroud)
同样在页面的源代码中,我可以看到所有ASP.NET生成的隐藏字段都正确地位于页面顶部.
Ari*_*tos 22
首先让我们从事实开始,这个视图状态错误发生在PostBack上.
另外,我必须说我已经完成了每个人建议做的所有事情来避免这个问题.我有一台机器,但有两个运行相同Pages的池.
所以有人通过"点击"你的页面来做一个动作,一个人,一个其他搜索机器,或者一些黑客试图检查你的系统是否有问题......
我有类似的问题(罕见但现有的),我终于发现人们试图破解测试我的页面.(来自我所拥有的相同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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在还有一个原因可以解决这个问题,原因是因为在加载__EVENTVALIDATION之前有一次点击页面.
这个eventValidation放在最后一个按钮上 - 甚至是asp.net找到的,如果你在页面上的许多地方或按钮附近有一些它们,那么这将转到页面的末尾.
因此,即使您在页面顶部看到视图状态,验证位置在哪里?也许这从未加载 - 页面损坏?用户点击页面太快?
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" ... >
Run Code Online (Sandbox Code Playgroud)
为了避免这种问题,我做了一个简单的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();";
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过在页面按钮附近延迟进行测试.
<% System.Threading.Thread.Sleep(5000); %>
Run Code Online (Sandbox Code Playgroud)
今天我再次在日志中看到WebResource的这条消息,我发现机器人获取页面并以小写形式在链接上创建所有字符,包括参数,所以这是获得正确编码字符串的另一个原因,并抛出像Padding这样的消息是无效的,无法删除.
希望这能帮到你更多.
| 归档时间: |
|
| 查看次数: |
13491 次 |
| 最近记录: |