Потенциально опасный запрос.Обнаружено значение формы

#asp.net-mvc

#asp.net-mvc

Вопрос:

У меня есть форма с редактором wmd на ней. Область ввода текста отображается с использованием:

 <%: Html.TextAreaFor(t => t.NewsBody, new{@class="wmd-panel", id="wmd-input"}) %>
  

Каждый раз, когда я отправляю форму, я получаю A potentially dangerous Request.Form value was detected from the client

Я попытался установить [ValidateInput(false)] в методе action, я попытался добавить
<httpRuntime requestValidationMode="2.0" />
в web.config и я попытался validateRequest="false" в директиве pages в web.config, но это все еще происходит.

Есть идеи?

Редактировать

Метод действия:

  [ILFFAuthorize(Roles = "Admin")] // this is a custom auth attrobite
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult AddNews(FormCollection col){

        //public ActionResult AddNews(News news)
        //{
            if (ModelState.IsValid)
            {
                News news = new News();
                news.NewsDate = DateTime.Now;
                news.NewsPosterId = 0;

                news.NewsTitle = col["NewsTitle"];
                news.NewsBody = col["NewsBody"];
                newsRepository.Add(news);
                newsRepository.Save();

                return RedirectToAction("Index", "Home");
            }
            else
            {
                return View();
            }
        }
  

Комментарии:

1. Просто для покрытия всех оснований, ValidateInput(false) находится в методе POST, правильно?

2. извините, я думаю, вы не совсем понимаете FormCollection суть. MVC добавляет это автоматически при генерации метода действия для вас. эта коллекция FormCollection содержит ВЕСЬ материал обратной передачи. вы можете легко сделать это: public ActionResult AddNews(FormCollection col, News news){ хотя это не решает вашу проблему. и когда вам не нужно ничего, кроме новостей, вы, вероятно, можете удалить Formcollection

3. При использовании MVC3 вы не можете использовать FormCollection при использовании [AllowHtml] . затем вы должны использовать свой News news

Ответ №1:

Вам нужно поместить это поверх вашего [HttpPost] метода действия

     [HttpPost]
    [ValidateInput(false)]
    public ActionResult Edit(FormCollection collection) {
       .....
    }
  

Если вы используете MVC3, то вам не следует использовать, [ValidateInput(false)] но используйте [AllowHtml] , что объясняется здесь: http://dailydotnettips.com/2011/08/24/how-to-allow-user-to-input-html-in-asp-net-mvc /

также: попробуйте поместить [ValidateInput(false)] над вашим [HttpPost] , а не под, насколько я помню, они выполняются сверху вниз.

Комментарии:

1. я добавил [ValidateInput(false)], имеет ли значение, что у меня нет FormCollection в качестве параметра?

2. можете ли вы отредактировать свой пост с помощью метода whole action? попробуйте добавить FormCollection. это может просто помочь.

3. попробуйте поместить [AllowHtml] поверх вашего NewsBody . какую версию MVC вы используете? вам нужно поместить в [AllowHtml] свойство то, NewsBody где вы определяете свой новостной объект. вы не забыли выполнить сборку?

4. попытался переместить его выше, не сработало. Это MVC2, извините, должен был сказать, что

5. я вижу это в третий раз link…it это 404

Ответ №2:

В MVC 3 добавьте [AllowHtml] к свойству в модели представления, которое вы не хотите проверять.

Ответ №3:

В файле web.config внутри тегов вставьте элемент HttpRuntime с атрибутом requestValidationMode=»2.0″. Также добавьте атрибут ValidateRequest=»false» в элемент pages.

Пример:

 <configuration>
  <system.web>
   <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>
  

Ответ №4:

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

Можете ли вы попробовать опубликовать стандартную строку (например, «hello») без WMD и проверить, достигнуты ли ваши точки останова в выбранном методе действия?

Ответ №5:

используйте [ValidateInput(false)] для устранения ошибок такого типа

Это происходит потому, что пользовательский ввод содержит различные html-теги.Таким образом, архитектура MVC3 не имеет разрешения для такого типа ввода.

Мы можем устранить эту ошибку, написав [ValidateInput(false)] над результатом действия или там, где мы отправляем нашу форму. Эта команда отключит проверку формы для html-тегов.

Ответ №6:

Я пытался найти решение этой проблемы целый день.
Отключение проверки не было вариантом.
Добавление AllowHTML также не было вариантом, поскольку по спецификации msdn:
AllowHtmlAttribute позволяет запросу включать HTML-разметку во время привязки модели, пропуская проверку запроса для свойства. источник

Кроме того, в проекте существует множество свойств со строковыми атрибутами, которые должны быть проверены, если для проверки по умолчанию установлено значение false.

Решение:

Я создал класс CustomRequestValidation:

 public class CustomRequestValidation : System.Web.Util.RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        validationFailureIndex = -1;
        if (requestValidationSource == RequestValidationSource.RawUrl)
            return true;

        if (requestValidationSource == RequestValidationSource.Form)
        {
            var isValid = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
            if (!isValid)
            {
                validationFailureIndex = -1;
                return true;
            }
        }

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

что он делает, так это то, что он просто пропускает проверку запроса с целью достижения состояния модели.

Затем я переопределил связующее по умолчанию для модели:

 public class CustomModelBinder : DefaultModelBinder
{

    protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
    {
        if (value != null)
        {
            if (propertyDescriptor.PropertyType == typeof(string))
            {
                string val = value.ToString();
                int validationIndex;
                var isValid = new System.Web.Util.RequestValidator().InvokeIsValidRequestString(controllerContext.HttpContext.ApplicationInstance.Context, val, RequestValidationSource.Form, null, out validationIndex);
                if (!isValid amp;amp; !propertyDescriptor.Attributes.OfType<AllowHtmlAttribute>().IsAny())
                {
                    var key = CreateSubPropertyName(bindingContext.ModelName, propertyDescriptor.Name);
                    bindingContext.ModelState.AddModelError(key, ErrorConstants.SpecialCharacters);
                }
            }
        }

        return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
    }
}
  

Теперь здесь мы выполняем всю проверку. В model binder я вызываю значение по умолчанию .Net использует метод validrequeststring вместе с проверкой, был ли установлен AllowHTML, и я соответствующим образом устанавливаю состояние модели. Это дает мне контроль над данными, и я могу вернуться на страницу и заполнить форму ранее введенными данными без запуска вставленных скриптов. Я использую строго типизированные модели.