我遇到了同样的问题,终于找到了解决方法。希望这会帮助遇到同样问题的其他人。
基本上,您需要扩展作为 System.Web.Util 一部分的 RequestValidator 基类。这是我的类,它将过滤掉 unicode 值和小于和大于符号的实际全宽:
using System.Web;
using System.Web.Util;
namespace Common.Extensions
{
public class RequestValidatorExtension : RequestValidator
{
private const string UNICODE_LESS_THAN = "%uff1c";
private const string UNICODE_GREATER_THAN = "%uff1e";
public RequestValidatorExtension() { }
protected override bool IsValidRequestString(
HttpContext context,
string value,
RequestValidationSource requestValidationSource,
string collectionKey,
out int validationFailureIndex
)
{
validationFailureIndex = -1;
if (value.Contains(UNICODE_LESS_THAN))
value = value.ReplaceWith(UNICODE_LESS_THAN, "<");
else if (value.Contains("<"))
value = value.ReplaceWith("<", "<");
if (value.Contains(UNICODE_GREATER_THAN))
value = value.ReplaceWith(UNICODE_GREATER_THAN, ">");
else if (value.Contains(">"))
value = value.ReplaceWith(">", ">");
return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}
}
在我的例子中,当“恶意”代码添加到文本框中时,它将作为 unicode 值传入。但是,当查询字符串被 Fiddler 拦截并修改时,该值将是全角符号。这就是为什么两者都要检查的原因。
您还必须在 web.config 或 global.asax 页面中注册这个新的 RequestValidationType。以下是两者的示例:
// Web.config
<httpRuntime requestValidationMode="2.0" requestValidationType="namespace.class" />
// Global.asax.cs
protected void Application_Start(object sender, EventArgs e)
{
RequestValidator.Current = new RequestValidatorExtension();
}
另外,here's a link 向 MS 文档了解如何利用和扩展该类。
希望这会有所帮助,干杯!