2008-11-13 2 views
3

У меня есть приложение, которое должно иметь дело с получением «специальных» символов в его URL-адресе (например, &, +,% и т. Д.). Когда я отправляю запрос в приложение с использованием этих символов (конечно, я отправляю их с экранированием), я получаю код ответа «Плохой запрос» с сообщением «ASP.NET обнаружил недопустимые символы в URL». Трассировка запроса показала мне, что ошибка была выбрана из «модуля аутентификации».Отмена проверки запроса с использованием HttpHandler на IIS 7

Я немного искал и обнаружил, что каждая страница имеет ValidateRequest и меняет ее значение на false, решает проблему. К сожалению, я использую Httphandler. Кто-нибудь знает, как остановить проверку запроса с помощью обработчика http?

ответ

2

Я столкнулся с той же проблемой (создав IHttpHandler, который должен был получать запросы со специальными символами в URL-адресе). Я должен был сделать две вещи, чтобы исправить это:

  1. Создайте следующую запись о регистрации DWORD со значением 1: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\VerificationCompatibility

  2. В web.config, установите атрибут allowDoubleEscaping элемента requestFiltering к правда.

-1

Вы можете установить validateRequest в false в разделе страниц web.config. Может быть, это работает и для HttpHandlers?

+0

Я пробовал. Это не работает ... – Itay 2008-11-13 14:36:19

0

Вы можете удалить все модули с

<httpModules> 
    <clear /> 
</httpModule> 

сделать запрос получите в обработчик. Или, возможно, вы можете удалить определенные модули, которые останавливают ваш запрос.

Это список модулей загружается по умолчанию в ASP.NET 2.0 из here

<httpModules> 
    <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" /> 
    <add name="Session" type="System.Web.SessionState.SessionStateModule" /> 
    <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" /> 
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 
    <add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" /> 
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
    <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" /> 
    <add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" /> 
    <add name="Profile" type="System.Web.Profile.ProfileModule" /> 
</httpModules> 
+0

Спасибо за ответ, но проблема в том, что есть некоторые необходимые модули, которые проверяют URL-адрес, поэтому мне нужно выяснить, как удалить проверку, а не модули ... – Itay 2008-11-13 16:06:42

0

Как насчет этого?

<system.web> 
    <pages validateRequest="false"> 
    </pages> 
</system.web> 
1

Ниже раствора работал на Me- Создать следующую запись о регистрации типа DWORD со значением 1: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\VerificationCompatibility

В web.config, установите атрибут элемента requestFilteringallowDoubleEscaping к true.

1

У меня была такая же проблема, и у меня была эта работоспособность, установив validateRequest = "false", а также requestValidationMode = "2.0", как показано ниже. Нет изменений в реестре.

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

Оптовые изменения на уровне приложения или машины были неприемлемыми для меня. У меня был только один параметр, который клиент посылал неправильно, что мне нужно было очистить.

Я обнаружил, что когда запрос сделан с html или другими потенциально опасными элементами в строке запроса, вы можете очистить строку с помощью context.Request.RawUrl и, как только строка запроса будет очищена, используйте context.RewritePath(scrubbedUrl).

  1. Первое в обработчике, получить context.Request.RawUrl
  2. Скраб плохой запрос RawUrl на плохой вход
  3. context.RewritePath(srubbedUrl)
  4. Profit

Похоже запрошено подтверждение заботится только о доступе к context.Request.Params[] , поэтому, если вы очищаете и переписываете путь (по тому же пути) до того, как будет доступна коллекция Params, вы будете золотыми.

0

С .NET Framework 4.5 вы можете использовать свойство Unvalidated на HttpRequest или HttpRequestBase для доступа к форме, строке запроса и данным URL таким образом, чтобы не инициировать проверку запроса. Если вы избегаете доступа к этим значениям любым другим способом (в том числе в вспомогательных методах или других HTTP-модулях, работающих в одном запросе), вам не потребуется ничего другого, чтобы избежать проверки запроса.

Смежные вопросы