清理ASP.NET输入(允许尖括号)

时间:2014-01-02 11:31:41

标签: c# asp.net validation webforms

我已经阅读过关于自定义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("<", "&lt;").Replace(">", "&gt;");
                }
                break;
        }

        return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
    }
}

现在我通过验证过滤器允许这些具有潜在危险的值,我希望确定他们正在妥善处理。这是一个Web窗体环境,所以我想我会创建一个CustomTextBox控件,覆盖Text属性和HtmlEncode字符串。

正如您从上面代码中的评论中看到的那样,我想限制我的RequestValidator,以便它只允许'危险'值通过验证,如果我可以确定它们将会是由我的CustomTextBox处理。如果我们需要继续Controlvalue,我怎样才能获得对collectionKey的引用?

2 个答案:

答案 0 :(得分:0)

表格密钥的验证甚至发生在Page PreInit事件之前。当时没有创建任何控件。

我认为您最好的机会是持有当前页面上存在的所有CustomTextBox个实例的UniqueID集合。拥有该集合后,您可以检查集合中是否存在要验证的表单密钥,这意味着它实际上是CustomTextBox

此集合可以在CustomTextBox控件内部进行管理,并保存在会话或应用程序缓存中。

答案 1 :(得分:0)

我建议在自定义控件构造函数中将ValidateRequestMode属性显式设置为ValidateRequestMode.Disabled并覆盖Text属性(或者用于存储值的任何属性)getter并返回根据您的具体情况消毒价值。