Подтвердить что ты не робот

Было обнаружено потенциально опасное значение Request.Form

У меня есть форма с редактором 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)] на метод действия, я попытался добавить <httpRuntime requestValidationMode="2.0" /> в web.config, и я пробовал validateRequest="false" в директиве pages в web.config, но это все еще происходит.

Любые идеи?

Edit

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

 [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();
            }
        }
4b9b3361

Ответ 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] не под, как я помню, они выполняются сверху вниз.

Ответ 2

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

Ответ 3

В файле web.config в тегах вставьте элемент httpRuntime с атрибутом requestValidationMode = "2.0". Также добавьте в элемент pages атрибут validateRequest = "false".

Пример:

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

Ответ 4

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

Можете ли вы попробовать разместить стандартную строку (т.е. "привет" ) без 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);
    }
}

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

Далее я переопределил привязку модели по умолчанию:

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 && !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);
    }
}

Теперь мы делаем всю проверку. В модельном связующем я вызываю метод по умолчанию .Net IsValidRequestString вместе с проверкой, установлен ли AllowHtml, и я соответствующим образом задал состояние модели. Он дает мне контроль над данными, и я могу вернуться на страницу и заполнить форму с ранее введенными данными, не отпуская вставленные скрипты. Я использую сильно типизированные модели.