如何检查字符串是否会引发“检测到潜在危险的 Request.Form 值...”错误

2024-01-01

如同这个问题 https://stackoverflow.com/questions/2760574/list-of-input-values-which-will-cause-the-a-potentially-dangerous-request-form但我不太关心哪些字符会/不会导致错误触发。我更好奇我可以调用什么方法来检查当前字符串是否会触发上述错误消息。

为了提供一些背景知识,当用户忘记密码并需要重置时,我会创建随机密码。不幸的是,随机密码生成器“意外地”创建了一个&#最近在其中。当用户尝试使用该页面登录时,这会导致页面中断。

正如围绕该主题的大量帖子中提到的,ValidateRequest=false (or <httpRuntime requestValidationMode="2.0" />for .NET 4.0)可用于关闭 .NET 对这些漏洞的检查,但当我是第一个创建字符串的人时,我认为没有任何理由失去这一额外的安全层。并简单地告诉随机生成器在不完整的列表上重新随机化(<, &#等)似乎不是最干净的解决方案,所以我想使用相同的方法来检查 .NET 正在使用。

微软对哪些漏洞存在问题以及正在采取哪些措施来防范这些漏洞的解释here http://msdn.microsoft.com/en-us/library/w1sw53ds.aspx.

This guy http://msdn.microsoft.com/en-us/library/ms972967.aspx谈论寻找一个名为的函数IsDangerousString在深入研究 Reflector 后,但我找不到这个函数来使用它。他还指的是 .NET 1.1,而我正在使用 .NET 3.5


验证请求的 ASP.NET 类是System.Web.CrossSiteScriptingValidation,你想要的方法是IsDangerousString。不幸的是,两者都被标记internal,因此您无法直接访问它们。您有多种选择:

选项1: Call IsDangerousString通过反射。但是,Microsoft 可以随时更改该方法,这会破坏您的应用程序。

选项2:反编译IsDangerousString并将其复制到您自己的应用程序中。请参阅下面的代码。

选项 3: Call Membership.GeneratePassword http://msdn.microsoft.com/en-us/library/system.web.security.membership.generatepassword.aspx。这将返回保证通过请求验证的密码。

摘自 ASP.NETCrossSiteScriptingValidation类(通过.NET Reflector):

private static char[] startingChars = new char[] { '<', '&' };

internal static bool IsDangerousString(string s, out int matchIndex)
{
    matchIndex = 0;
    int startIndex = 0;
    while (true)
    {
        int num2 = s.IndexOfAny(startingChars, startIndex);
        if (num2 < 0)
        {
            return false;
        }
        if (num2 == (s.Length - 1))
        {
            return false;
        }
        matchIndex = num2;
        char ch = s[num2];
        if (ch != '&')
        {
            if ((ch == '<') && ((IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')) || ((s[num2 + 1] == '/') || (s[num2 + 1] == '?'))))
            {
                return true;
            }
        }
        else if (s[num2 + 1] == '#')
        {
            return true;
        }
        startIndex = num2 + 1;
    }
}

private static bool IsAtoZ(char c)
{
    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查字符串是否会引发“检测到潜在危险的 Request.Form 值...”错误 的相关文章

随机推荐