为什么有些“潜在危险的Request.Path”HttpExceptions会忽略httpErrors设置?

时间:2015-02-10 10:39:59

标签: asp.net exception configuration umbraco

我有一个.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特有的东西,可能是一个模块。

2 个答案:

答案 0 :(得分:0)

validate helper方法首先调用输入验证然后调用路径。

在验证位于&#34; syste.web / httRuntime&#34;的默认web.config设置的输入时,验证助手方法的默认配置中设置的默认值。 requestPathInvalidCharactersArray属性是:

&LT;,&GT;,*,%,&安培;,:,\ ,?

来源:https://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.requestpathinvalidcharacters(v=vs.110).aspx

如你所见&#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起修复