Почему я получаю сообщение об ошибке клиента «Потенциально опасное значение Request.Form»?

Я создал новый сайт ASP.NET MVC 3/.NET Framework 4.0, используя шаблон "Интернет-приложение". Я использовал Nuget для установки пакета Веб-роли Windows Azure (MVC3) и затем следуйте пошаговому руководству службы управления доступом, чтобы настроить Windows Live ID и Google аутентификация.

Достаточно скоро я наткнулся на ошибку «От клиента было обнаружено потенциально опасное значение Request.Form» и последовал за статья в вики Windows Identity Foundation, чтобы попытаться решить эту проблему. К сожалению, ничего из того, что я пробовал, не работает, в том числе:

  • Настройка <httpRuntime requestValidationMode="2.0"/> и <pages validateRequest="false"> как в корневом файле web.config, так и в Views\web.config

  • Копирование SampleRequestValidator из WIF SDK в проект и настройка <httpRuntime requestValidationType="SampleRequestValidator"/> в обоих web.configs

Я также пробовал их варианты без успеха.

Есть идеи?

Вот полное исключение:


Сведения об исключении: System.Web.HttpRequestValidationException: от клиента было обнаружено потенциально опасное значение Request.Form (wresult="<t:RequestSecurityTo...").

Описание: Проверка запроса обнаружила потенциально опасное входное значение клиента, и обработка запроса была прервана. Это значение может указывать на попытку компрометации безопасности вашего приложения, например, на атаку с использованием межсайтовых сценариев. Чтобы разрешить страницам переопределять параметры проверки запроса приложения, установите для атрибута requestValidationMode в разделе конфигурации httpRuntime значение requestValidationMode="2.0". Пример: <httpRuntime requestValidationMode="2.0" />. После установки этого значения вы можете отключить проверку запроса, установив validateRequest="false" в директиве Page или в разделе конфигурации <pages>. Однако в этом случае настоятельно рекомендуется, чтобы ваше приложение явно проверяло все входные данные. Дополнительные сведения см. на странице http://go.microsoft.com/fwlink/?LinkId=153133<. /а>.

Трассировка стека:

[HttpRequestValidationException (0x80004005): от клиента было обнаружено потенциально опасное значение Request.Form (wresult="<t:RequestSecurityTo...").]

System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8755668
System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +122
System.Web.HttpRequest.get_Form() +114
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.IsSignInResponse(HttpRequest request) +75
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request, Boolean onPage) +205
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request) +41
Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +117
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75


person Alex Angas    schedule 07.05.2011    source источник


Ответы (9)


Вы можете попробовать украсить действие контроллера, которому вы отправляете сообщение (и то, которое выдает это исключение), с помощью атрибута [ValidateInput(false)] (оставив <httpRuntime requestValidationMode="2.0"/> в web.config).

person Darin Dimitrov    schedule 07.05.2011
comment
Не повезло. Исключение, кажется, происходит до попадания в контроллер. Я обновлю вопрос с помощью трассировки стека. - person Alex Angas; 07.05.2011

У меня такая же проблема.

Вот пример моего решения:

 [ValidateInput(false)]

    public ActionResult *YourMethodName*(FormCollection forms)
    {
          // Encoded String
          string EncodedValue = Server.HtmlEncode(forms[*name or index*]);

         // Normal String 
         string value = forms[*name or index*]

         //.... 
    }

Вам ничего не нужно в вашем webconfig.

person Marco Ramos    schedule 07.11.2011

Я написал об этом небольшую заметку в блоге здесь: http://erikbra.wordpress.com/2012/04/17/wif-saml-token-post-and-requestvalidationmode2-0/. Нет необходимости отключать проверку запросов или устанавливать ее на 2.0 для всего сайта.

Короче говоря, вам нужно только изменить режим requestValidationMode на 2.0 для определенного URL-адреса, на который WIF отправляет токен SAML. Это можно сделать с помощью элемента (подробности см. в элементе location (схема настроек ASP.NET)) в файле web.config, например:

<location path="WIFHandler">
  <system.web>
    <httpRuntime requestValidationMode="2.0" />
  </system.web>
</location>

Расположение «WIFHandler» не обязательно должно существовать в вашем приложении, так как WIF сократит конвейер до того, как ASP.NET попытается обработать запрос, и вместо этого перенаправит вас на обратный URL-адрес (ru в параметре wctx маркера SAML POST) .

В разделе конфигурации WIF файла web.config обязательно сопоставьте параметр «ответ» с местоположением, в котором вы установили режим проверки запроса на режим 2.0:

<microsoft.identityModel>
    <service>
      <federatedAuthentication>
        <wsFederation passiveRedirectEnabled="true" 
                      issuer="https://localhost/STS/" 
                      realm="https://localhost/MyApp/"
                      reply="https://localhost/MyApp/WIFHandler/" />

(...)
person Erik A. Brandstadmoen    schedule 17.04.2012
comment
Работал на меня. Я бы порекомендовал разместить полный ответ здесь, а не перенаправлять ответ на ваш сайт для получения подробной информации. - person Rick Glos; 03.06.2013
comment
К вашему сведению, полный ответ теперь вставлен сюда :) - person Erik A. Brandstadmoen; 22.11.2013

Во-первых, узкое, откуда это исходит. Используйте fiddler, чтобы выяснить, какое поле вызывает проблему. Элементы, такие как: ‹s, вызовут эту ошибку, если они будут опубликованы без кодирования. Также вы можете захотеть украсить свою МОДЕЛЬ атрибутом [AllowHtml] и попытаться не включать кодировку 2.0 - это немного опасно.

person Adam Tuliper - MSFT    schedule 07.05.2011

Копирование SampleRequestValidator из WIF SDK в проект и настройка в обоих файлах web.config

Это должно исправить это. Можете ли вы проверить, что код действительно выполняется? Если вы поместите точку останова в валидатор запросов, сработает ли она?

Я полагаю, вы поставили <httpRuntime...> под <system.web> правильно?

person Eugenio Pace    schedule 07.05.2011
comment
Существует пакет NuGet для средства проверки запросов WIF nuget.org/packages/WifRequestValidator. - person webwires; 27.06.2013

Я не вижу здесь никакого ответа, упомяните об этом. так вот оно идет.

В дополнение к «[ValidateInput(false)]» в вашем aspx вам может потребоваться добавить это на вашу ‹%@Page ...>

<%@ Page ValidateRequest="false">

Это позволит отключить проверку запросов для каждой страницы, а не для всего веб-приложения.

person Jach    schedule 30.10.2013
comment
100% согласен, это абсолютно необходимо + это чисто, так как проверка запроса отбрасывается только для соответствующей страницы, а не для всего сайта. Спасибо, что поделился! - person Patrick from NDepend team; 26.08.2014

Я столкнулся с этой проблемой при прохождении учебника «Единый вход из Active Directory в приложение Windows Azure». В моем случае проблема заключалась в том, что я непреднамеренно поместил значение <httpRuntime ... /> в неправильный раздел <system.web /> в моем файле web.config (сначала я этого не заметил, но есть новый раздел <location> с путем «FederationMetadata», который также содержит system.web.). Значение должно быть помещено в секцию <system.web> верхнего уровня.

person NateTheGreat    schedule 07.12.2011

На первый взгляд это похоже на ошибку в библиотеке Azure Mvc3. MVC 3 предоставляет специальные API, которые позволяют извлекать непроверенные значения из коллекции Form, но модуль, похоже, их не использует.

person marcind    schedule 07.05.2011

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

Вместо этого я нашел пример пользовательского входа MVC3, который соответствует этим требованиям и оно работает.

person Alex Angas    schedule 08.05.2011