OutputCache和一个潜在危险的请求

时间:2016-03-25 17:08:50

标签: c# asp.net .net asp.net-mvc outputcache

我已启用OutputCache,并使用以下属性:

[OutputCache]
[ValidateInput(false)]

但我收到以下错误:

  

[HttpRequestValidationException(0x80004005):有潜在危险   从客户端检测到Request.QueryString值   (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动词,HttpContext上下文,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 只会出错。

没有一切正常。

更新 这似乎很容易重现:

  1. 使用ASP.NET MVC模板启动新的ASP.NET项目(4.5.2)
  2. 添加[OutputCache( Duration = 1)]
  3. 运行http://localhost:(port)/?test=%3Cscript%3E
  4. 结果: 尽管您对此参数执行了任何操作,但仍存在潜在危险请求。

3 个答案:

答案 0 :(得分:0)

问题发生的原因是客户端将pool="lger<br />传递给查询字符串。请注意HTML字符<br />,这可以被视为XSS攻击,框架默认为您处理。

您希望启用此安全性,想象一下客户端是否已通过

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

作为查询字符串的一部分,它可以反映或持久保存给系统用户。

您还可以添加MVC属性AllowHtml

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

但是,如果您确实要禁用请求验证(Not recommended),则可以通过web.config

执行此操作
<system.web>
  <httpRuntime requestValidationMode="2.0" />
</system.web>

答案 1 :(得分:0)

您似乎需要使用[AllowHtml]属性。

请参阅here以供参考。

  

默认情况下,ASP.NET MVC框架在模型期间检查请求   绑定以确定它们是否包含潜在危险   内容为HTML标记。如果检测到HTML,则模型绑定会抛出   错误。如果属性标记为AllowHtmlAttribute属性,   ASP.NET MVC框架在此过程中跳过对该属性的验证   模型绑定。

答案 2 :(得分:0)

错误的原因是OutputCachedItemKey试图为请求创建一个包含参数信息的唯一标识符。这样做会调用ValidateString,这会导致被认为是危险值的异常。

也就是说,我也没有一个真正的解决方案。但是,如果目标是完全禁用操作的缓存,则此属性应该起作用

[OutputCache(Duration = 0, VaryByContentEncoding = null, VaryByCustom = null, VaryByHeader = null, VaryByParam = null)]