Microsoft的.NET Framework用于执行标准验证的regular expression是什么导致HttpRequestValidationException“当发布HTML或其他可能不安全的内容时,”从客户端检测到潜在危险的Request.Form值“。
我希望将完全复制转换为JavaScript,以便及早提醒用户。
我当前的正则表达式(/(&#)|< [^<>] +> /)接近,但与.NET不同。
我知道这对于不同的.NET版本可能会有所不同,所以我特别想知道:
答案 0 :(得分:4)
您可以使用一些反编译工具,亲眼看看根本没有正则表达式。它调用静态方法CrossSiteScriptingValidation.IsDangerousString
。
但也许您可以使用Microsoft AntiXSS库来实现相同目标。无论如何这里是方法:
internal static bool IsDangerousString(string s, out int matchIndex)
{
matchIndex = 0;
int num1 = 0;
int num2 = s.IndexOfAny(CrossSiteScriptingValidation.startingChars, num1);
if (num2 < 0)
{
return false;
}
if (num2 == s.Length - 1)
{
return false;
}
matchIndex = num2;
char chars = s.get_Chars(num2);
if ((chars == 38 || chars == 60) && (CrossSiteScriptingValidation.IsAtoZ(s.get_Chars(num2 + 1)) || s.get_Chars(num2 + 1) == 33 || s.get_Chars(num2 + 1) == 47 || s.get_Chars(num2 + 1) == 63))
{
return true;
}
else
{
if (s.get_Chars(num2 + 1) == 35)
{
return true;
}
}
num1 = num2 + 1;
}
答案 1 :(得分:3)
我可能在另一个问题中回答了这个问题: https://stackoverflow.com/a/4949339/62054
这个正则表达式遵循.NET 4中的逻辑。
/^(?!(.|\n)*<[a-z!\/?])(?!(.|\n)*&#)(.|\n)*$/i
在.NET源代码中查找CrossSiteScriptingValidation以查找Microsoft遵循的逻辑。 fge是对的,它不使用正则表达式,而是使用一些循环和字符串比较。我怀疑这是为了表现。