Как правильно обработать эту ошибку в asp.net? - PullRequest
3 голосов
/ 03 марта 2010

У меня есть сайт asp.net .... Я хотел бы знать, как корректно обработать эту ошибку, когда пользователь входит и отправляет недопустимый символ (атака xss).

"На клиенте обнаружено потенциально опасное значение Request.Form (ctl00 $ TextBox1 =" ") ......... и т. Д."

Я могу отключить атрибут requestvalidation и написать код для фильтрации строки с недопустимыми символами, но я думаю, что не рекомендуется отключать его. Я бы предпочел оставить это включенным и поймать ошибку, изящно сказать, перенаправив пользователя на другую страницу, которая сообщит ему / ей об ошибке. Как бы вы это сделали?

Ответы [ 4 ]

2 голосов
/ 19 февраля 2014

У меня была та же проблема в проекте, который мы хотели продолжать использовать параметры запроса проверки в качестве первой линии защиты. Проблема заключается в том, что в веб-формах значения форм проверяются на начальном этапе запроса процесса.

То, как мы в конце концов решили это, выглядит следующим образом:

  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), поэтому исключение срабатывает при необходимости.

1 голос
/ 04 марта 2010

Эта ошибка происходит на более высоком уровне на странице, перед обработкой какой-либо основной обработки, и это приводит к прерыванию запроса.

Я считаю, что ваш единственный вариант здесь - обработать исключение для метода Application_Error в global.asax, а затем перенаправить на пользовательскую страницу ошибки при необходимости.

0 голосов
/ 04 марта 2010

Сначала проверьте с помощью JavaScript, и немедленно отобразите сообщение об ошибке. И продублируйте эту проверку в событии Application_Error, как сказал Митчел.

0 голосов
/ 04 марта 2010

Обращайтесь изящно, хорошо, вам придется выполнить проверку формы, чтобы найти ошибку самостоятельно, поэтому вам придется сделать это для каждого элемента ввода или создать компонент для анализа отправленной коллекции форм, а это не простая задача. .. (или хотя бы отметьте соответствующие поля).

Тогда вы можете перенаправить на страницу с сообщением об ошибке. В качестве альтернативы, если вы оставите его включенным и, как уже упоминалось, обрабатываете Application_Error (или, возможно, метод OnError на странице), вы можете затем перенаправить их на страницу ошибки с этим сообщением, по сути, делая то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...