Потенциально опасный запрос, вызванный фильтром OutputCache

Я вижу странное поведение в моем приложении MVC3. У меня есть действие, которое вызывается Ajax и получает сообщение с текстом HTML. Я хочу разрешить ввод HTML, поэтому я установил атрибут ValidateInput(false). У меня также есть глобальный фильтр OutputCache с такими параметрами: (NoStore = true, Duration = 0, VaryByParam = "*")
Код выглядит так:

[HttpPost]
[ValidateInput(false)]
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*" )]
public ActionResult Edit(SomeModel someModel)
{
   saveModel(someModel);
   return new AjaxEditSuccessResult();
}

Когда я отправляю сообщение этому методу, оно выполняется, и модель сохраняется, но в ответ я получаю стандартное сообщение об ошибке "Потенциально опасное значение Request.Form было обнаружено клиентом" со следующей трассировкой стека:

[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (text="<p class="MsoNormal"...").]
System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +9665149
System.Web.<>c__DisplayClass5.<ValidateHttpValueCollection>b__3(String key, String value) +18
System.Web.HttpValueCollection.EnsureKeyValidated(String key) +9664565
System.Web.HttpValueCollection.Get(String name) +17
System.Web.Caching.OutputCacheModule.CreateOutputCachedItemKey(String path, HttpVerb verb, HttpContext context, CachedVary cachedVary) +676
System.Web.Caching.OutputCacheModule.CreateOutputCachedItemKey(HttpContext context, CachedVary cachedVary) +55
System.Web.Caching.OutputCacheModule.OnLeave(Object source, EventArgs eventArgs) +9716788
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69

Знаете ли вы, могу ли я каким-либо образом указать атрибуту OutputCache, что он должен соответствовать атрибуту ValidateInput?

1 ответ

В потоке есть два места, где вызывается проверка:

  1. при вызове метода контроллера
  2. при выдаче результат сохраняется в кеше.

Вы устранили первую проблему с ValidateInputAttribute(false), но похоже, что модуль кеша игнорирует NoStore директива и до сих пор пытается создать ключ кеша и, прежде чем делать это, проверяет аргументы, чтобы избавиться от указанного: Location = System.Web.UI.OutputCacheLocation.None, так что модуль кеша даже не попытается ничего сделать. Замените свой OutputCache[...] с чем-то вроде этого:

[OutputCache(NoStore = true, Location = System.Web.UI.OutputCacheLocation.None)]
Другие вопросы по тегам