Почему я получаю сообщение об ошибке «Обнаружено потенциально опасное значение Request.Form от клиента»? - PullRequest
20 голосов
/ 07 мая 2011

Я создал новый сайт ASP.NET MVC 3 / .NET Framework 4.0, используя шаблон «Интернет-приложение».Я использовал Nuget для установки пакета Windows Azure Web Role (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: Aпотенциально опасное значение 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

Ответы [ 9 ]

18 голосов
/ 07 мая 2011

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

16 голосов
/ 08 ноября 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*]

         //.... 
    }

Вам ничего не нужно в вашей веб-конфигурации.

13 голосов
/ 17 апреля 2012

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

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

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

Местоположение «WIFHandler» не обязательно должно существоватьваше приложение, поскольку WIF будет сокращать конвейер до того, как ASP.NET попытается обработать запрос, и вместо этого перенаправит вас на URL-адрес возврата (ru в параметре wctx параметра POST SAML token).В разделе конфигурации WIF файла web.config обязательно сопоставьте параметр «reply» с местом, в котором вы установили режим проверки запроса на режим 2.0:

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

(...)
2 голосов
/ 30 октября 2013

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

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

<%@ Page ValidateRequest="false">

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

2 голосов
/ 07 мая 2011

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

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

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

2 голосов
/ 07 мая 2011

Первый - узкий, откуда это исходит.Используйте fiddler, чтобы выяснить, какое поле вызывает проблему.Предметы так просто, как:

1 голос
/ 07 декабря 2011

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

0 голосов
/ 09 мая 2011

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

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

0 голосов
/ 07 мая 2011

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

...