我已经阅读过关于自定义ASP.NET请求的输入验证以避免可怕的“检测到潜在危险值”。我正在使用以下代码来允许有角度的括号通过验证。
public class RequestValidator : System.Web.Util.RequestValidator {
protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) {
validationFailureIndex = 0;
switch (requestValidationSource) {
case RequestValidationSource.Form:
if (control is CustomTextBox) { // How can I get the control?
// allow angle brackets to pass validation
value = value.Replace("<", "<").Replace(">", ">");
}
break;
}
return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
}
}
现在我通过验证过滤器允许这些具有潜在危险的值,我希望确定他们正在妥善处理。这是一个Web窗体环境,所以我想我会创建一个CustomTextBox
控件,覆盖Text
属性和HtmlEncode
字符串。
正如您从上面代码中的评论中看到的那样,我想限制我的RequestValidator
,以便它只允许'危险'值通过验证,如果我可以确定它们将会是由我的CustomTextBox
处理。如果我们需要继续Control
和value
,我怎样才能获得对collectionKey
的引用?
答案 0 :(得分:0)
表格密钥的验证甚至发生在Page PreInit
事件之前。当时没有创建任何控件。
我认为您最好的机会是持有当前页面上存在的所有CustomTextBox
个实例的UniqueID集合。拥有该集合后,您可以检查集合中是否存在要验证的表单密钥,这意味着它实际上是CustomTextBox
。
此集合可以在CustomTextBox
控件内部进行管理,并保存在会话或应用程序缓存中。
答案 1 :(得分:0)
我建议在自定义控件构造函数中将ValidateRequestMode
属性显式设置为ValidateRequestMode.Disabled
并覆盖Text
属性(或者用于存储值的任何属性)getter并返回根据您的具体情况消毒价值。