我已启用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 只会出错。
没有一切正常。
更新 这似乎很容易重现:
[OutputCache( Duration = 1)]
结果: 尽管您对此参数执行了任何操作,但仍存在潜在危险请求。
答案 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)]