2016-03-25 5 views
1

Я включил OutputCache, и используют следующие атрибуты:OutputCache и потенциально опасное Запрос

[OutputCache] 
[ValidateInput(false)] 

Но я получаю следующее сообщение об ошибке:

[HttpRequestValidationException (0x80004005): A potentially dangerous Request.QueryString value was detected from the client (pool="lger<br />/for...").]
System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +11933898
System.Web.HttpValueCollection.EnsureKeyValidated(String key) +11932776 System.Web.HttpValueCollection.Get(String name) +23 System.Web.Caching.OutputCacheModule.CreateOutputCachedItemKey(String path, HttpVerb verb, HttpContext context, CachedVary cachedVary) +880 System.Web.Caching.OutputCacheModule.OnLeave(Object source, EventArgs eventArgs) +803
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +142 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +92

Почему это происходит? Я не понимаю, почему OutputCachedItemKey необходимо проверить? В любом случае, как отключить это?

Обратите внимание, что это происходит только при включении OutputCache.

Без всего, что хорошо работает.

Update Это кажется очень простой reproduciable:

  1. Запуск проекта нового ASP.NET с помощью ASP.NET MVC шаблон (4.5.2)
  2. Добавить [OutputCache(Duration = 1)]
  3. пробег http://localhost:(port)/?test=%3Cscript%3E

Результат: Потенциально опасный запрос, несмотря на то, что вы выполняете с этим параметром.

ответ

0

Проблема возникает из-за того, что клиент прошел в pool="lger<br /> в строку запроса. Обратите внимание на HTML-символ <br />, это можно считать атакой XSS, и инфраструктура по умолчанию будет работать для вас по умолчанию.

Вы хотите сохранить эту безопасность включена, представьте себе, если клиент прошел до

"<script type='javascript'>//Nasty code</script>" 

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

Вы также можете добавить атрибут MVC AllowHtml.

public class Model 
{ 
    [AllowHtml] 
    public string Pool { get; set; } 
} 

Однако, если вы действительно хотите, чтобы отключить запрос Validation (Not recommended), то вы можете сделать это через web.config

<system.web> 
    <httpRuntime requestValidationMode="2.0" /> 
</system.web> 
+0

'[AllowHtml]' обычно переходит на модальные свойства, а не на контроллеры. _Получает запрос на включение разметки HTML во время привязки к модели, пропуская проверку запроса для свойства ._ – zgood

+0

@zgood - хороший крик, обновленный. –

+0

Привет @ DarrenDavies, спасибо за ваш быстрый ответ. Дело в том, что мое действие отлично работает (я не читаю значение). Это OutputCache, который, похоже, не в состоянии справиться с этим - см. StackTrace. –

0

Похоже, что вам нужно использовать атрибут [AllowHtml].

См. here для справки.

By default, the ASP.NET MVC framework checks requests during model binding to determine whether they contain potentially dangerous content as HTML markup. If HTML is detected, model binding throws an error. If a property is marked with the AllowHtmlAttribute attribute, the ASP.NET MVC framework skips validation for that property during model binding.

+0

Привет @zgood, спасибо за ваш быстрый ответ. Дело в том, что мое действие отлично работает (я не читаю значение). Это OutputCache, который, похоже, не в состоянии справиться с этим - см. Включенный StackTrace. –