asp.net - 如何在 asp.net 中优雅地处理这个错误?

标签 asp.net error-handling xss

我有一个 asp.net 站点....我想知道当用户输入并提交非法字符(xss 攻击)时如何优雅地处理此错误。

“从客户端检测到具有潜在危险的 Request.Form 值 (ctl00$TextBox1="").......等等"

我可以关闭 requestvalidation 属性并编写代码来过滤包含非法字符的字符串,但我认为关闭它不是一个好习惯。我宁愿保留它并优雅地捕获错误说将用户重定向到另一个页面会告诉他/她错误。你会怎么做?

最佳答案

我在一个项目中遇到了同样的问题,我们希望继续使用验证请求选项作为第一道防线。问题在于,在 Web 表单中,表单值在处理请求的初始阶段得到验证。

我们最终通过以下方式解决了这个问题:

  1. 禁用项目的请求验证
  2. 创建一个继承自基本验证器的自定义验证器
  3. 在所有页面(或母版页)上使用自定义验证器

我们的自定义验证器看起来与下面的类似:

public class UserInputValidator : BaseValidator
{

    private HttpRequest Request
    {
        get { return HttpContext.Current.Request; }
    }


    protected override bool ControlPropertiesValid()
    {
        //Override the base functionality because this will check for a control to validate, what we won't do. 
        return true;
    }

    protected override bool EvaluateIsValid()
    {
        bool isValid = true;
        var message = new StringWriter();
        if (Request != null)
        {
            //Validate input will enable request validation. 
            Request.ValidateInput();
            NameValueCollection formValues = Request.Form;
            foreach (string formKey in formValues.Keys)
            {
                try
                {
#pragma warning disable 168
                    //Access the form variable to trigger request validation.
                    string formValue = formValues[formKey];
#pragma warning restore 168
                }
                catch (HttpRequestValidationException)
                {
                    string orgValue = Request.Unvalidated.Form[formKey];



                    message.WriteLine("The following input is not allowed: {0}", HttpUtility.HtmlEncode(orgValue));
                    isValid = false;
                }
            }
        }
        ErrorMessage = message.ToString();
        return isValid;
    }
}

这是有效的,因为当禁用请求验证时,ValidateInput没有被调用。通过在验证页面时调用此方法,我们强制为请求激活请求验证。

接下来我们要做的是访问表单集合中的每个值(至少在 asp.net 4.5 中),以便在适当的时候触发异常。

关于asp.net - 如何在 asp.net 中优雅地处理这个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374866/

相关文章:

Ant 等价于 nant.onsuccess/nant.onfailure

matlab - Matlab ode45基本设置

coldfusion - 删除 Coldfusion 字符串中的逗号

c# - 如何从存储过程中获取返回值?

asp.net - .ashx 中的 Server.UrlEncode

c# - 从 paypal 结帐返回后在 firefox 中丢失 session

javascript - 如何找到父域和顶级域(iframe)之间的差异以克服跨框架脚本

c# - 将检查开始时间和结束时间是否可用的 LINQ 查询

asp-classic - 如何忽略从ASP调用的SQL Server 2000过程中嵌套存储过程中的错误

javascript - 为了保护它免受 XSS 攻击,对内联 javascript 对象进行编码的正确方法是什么?