MVC 4 - Razor - "потенциально опасное значение request.form было обнаружено от клиента"

У меня есть i-Frame на мой взгляд, который ссылается на внешний сайт. Этот сайт принимает некоторые значения и некоторые настройки конфигурации. В составе этих настроек конфигурации есть "CallBackURL". Этот внешний веб-сайт публикует сообщения в этом CallBackUrl.

Я указал CallBackURL, чтобы быть действием на моем элементе управления.

Посмотреть код

<form id="testForm" method="post" target="testFrame">
  <input type="hidden" name="RequestXML" ID="RequestXML" value="<Request><RedirectURL>Account/TokenRequest</RedirectURL></Request>"
</form>

<iframe id="testFrame" name="testFrame" frameborder="0" style="width:1000px;height:500px"></iframe>

Код контроллера

  [HttpPost]
  [ValidateInput(false)]
  public ActionResult TokenRequest()
  {
    if (Request.Form["ResponseXML"] != null)
      ViewBag.ResponseXML = Request.Form["ResponseXML"];

    return PartialView();
  }

внутри моего действия контроллера я получаю следующую ошибку:"потенциально опасное значение request.form было обнаружено от клиента"

Я также установил это в webconfig

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

Что я делаю неправильно?

РЕДАКТИРОВАТЬ Я редактировал неправильный файл web.config. Я добавлял его в web.config внутри папки views. Как только я изменил его в нужное место, он начал работать.

4 ответа

Вышеупомянутое решение не работает для меня в MVC4. Что работает для меня, это только поставить атрибут над действием. Нет необходимости изменять ваш web.config или добавлять атрибут AllowHtml.

[HttpPost]
[ValidateInput(false)]
public ActionResult TokenRequest(TokenRequestModel model)
{
  if (!string.IsNullOrEmpty(model.ResponseXML))
  ViewBag.ResponseXML = model.ResponseXML;
  // ...

Попробуйте использовать модель, а не просто использовать прямое управление html. а также использовать атрибут AllowHtml.

Модель:

public TokenRequestModel
{
   [AllowHtml]
   public string ResponseXML {get;set;}
}

Действие:

[HttpPost]
public ActionResult TokenRequest(TokenRequestModel model)
{
  if (!string.IsNullOrEmpty(model.ResponseXML))
      ViewBag.ResponseXML = model.ResponseXML;

  return PartialView();
}

Ты можешь попробовать

  [HttpPost]
  public ActionResult TokenRequest()
  {
    if (Request.Unvalidated().Form["ResponseXML"] != null)
      ViewBag.ResponseXML = Request.Unvalidated().Form["ResponseXML"];

    return PartialView();
  }

Я думаю, что Unvalidated() сделает ошибку исчезнет без необходимости редактировать webconfig

Я попробовал это и работал для меня:

при отправке формы вызовите функцию javascript, которая сохраняет в скрытом поле значение, закодированное с помощью 'encodeURIComponent'.

Затем в той же функции очистите значение текстового поля с опасным значением. Таким образом, форма будет отправлять только закодированное значение.

<input type="submit" value="Save" class="btn btn-danger" onclick="encodeLabel1()" />

<script>
function encodeLabel1() {
            var label = $('#txt').val();
            $('#hfLabel1Encoded').val(encodeURIComponent(label);
            $('#txt').val('');
        }
 </script>

Это обходной путь, но он работает, и проверка все еще активна.

Другие вопросы по тегам