我有一个.Net网站,其中包含使用web.config httpErrors
部分配置的自定义错误页面:
<httpErrors errorMode="Custom" existingResponse="Replace">
<clear/>
<error statusCode="400" path="/page-not-found/" responseMode="ExecuteURL" />
<error statusCode="404" path="/page-not-found/" responseMode="ExecuteURL" />
<error statusCode="500" path="/error/" responseMode="ExecuteURL" />
</httpErrors>
和
<httpRuntime requestValidationMode="2.0" targetFramework="4.5" />
当我访问http://www.example.com/<
时,该网站会显示未找到正确的&#34;页面&#34;页面,但是如果我访问http://www.example.com/<a
,它会显示一个带有500状态代码响应标题的YSOD。
我让Elmah迷上了,两个网址都可预测地抛出完全相同的错误System.Web.HttpException: A potentially dangerous Request.Path value was detected from the client (<).
但为什么这两个网址的处理方式不同?为什么要将一个重写到我的自定义错误页面,另一个不是?我希望任何例外情况都是相同的行为。
修改
我应该事先提到这是一个Umbraco项目。我认为这不是一个促成因素,但我创建了一个没有依赖关系的准系统.Net项目,这可以按预期工作,即两个URL都遵循httpErrors配置。所以这必须是Umbraco特有的东西,可能是一个模块。
答案 0 :(得分:0)
validate helper方法首先调用输入验证然后调用路径。
在验证位于&#34; syste.web / httRuntime&#34;的默认web.config设置的输入时,验证助手方法的默认配置中设置的默认值。 requestPathInvalidCharactersArray属性是:
&LT;,&GT;,*,%,&安培;,:,\ ,?
如你所见&#34;&lt;&#34;被视为无效的PATH,而&#34;&lt; a&#34;将被视为无效的INPUT,这就是为什么你得到两个行为。
如果您对如何解决这个问题感到好奇,我只是查看了验证助手方法的源代码,并将其跟回源代码。
[编辑]
ValidateInputIfRequiredByConfig方法显示它抛出400
[编辑2]
public NameValueCollection QueryString
{
get
{
this.EnsureQueryString();
if (this._flags[1])
{
this._flags.Clear(1);
this.ValidateHttpValueCollection(this._queryString, RequestValidationSource.QueryString);
}
return this._queryString;
}
}
如果验证源是Querystring,则调用此属性命中ValidateHttpValueCollection可以验证查询字符串,该属性位于此属性中。
在此方法中,有一个名为ValidateString的方法。在ValidateString中,它确定它是否是有效字符串,如果不是,则抛出HttpRequestValidationException
答案 1 :(得分:0)
经过大量挖掘后,我发现这实际上是由名为ClientDependency的第三方模块引起的。删除了这个和恢复的正常行为,但显然在这种情况下后台将无法正常运行。
项目需要补丁,我已经提交了。
<强>更新强>
ClientDependency中的这个错误已从v1.8.3起修复