2015-02-10 54 views
0

我有一個.net網站與自定義錯誤頁使用的web.config httpErrors部分配置:爲什麼一些'有潛在危險的Request.Path'HttpExceptions忽略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/<網站顯示正確的「找不到網頁」頁面,但是如果我訪問http://www.example.com/<a它會顯示帶有500狀態碼響應標題的YSOD。

我已經ELMAH迷上了和這兩個URL可以預見拋出一模一樣的錯誤System.Web.HttpException: A potentially dangerous Request.Path value was detected from the client (<).

但是,爲什麼在兩個網址不處理的一樣嗎?爲什麼一個人重寫到我的自定義錯誤頁面,另一個不是?我期望從任何異常都有相同的行爲。

編輯:

我應該提到了前面,這是一把umbraco項目。我認爲這不是一個促成因素,但我創建了一個沒有依賴關係的準系統.Net項目,並且按預期工作,即兩個URL都遵循httpErrors配置。所以這一定是Umbraco特定的東西,可能是一個模塊。

回答

0

經過大量的挖掘後,我可以看到這實際上是由第三方模塊ClientDependency引起的。刪除這個和正常行爲返回,但顯然在這種情況下,後臺將無法正常工作。

該項目的補丁是必需的,我已經提交了這個。

更新:

在ClientDependency此bug已被修正爲v1.8.3

0

驗證幫助器方法首先調用輸入和路徑的驗證。

了在用於驗證輔助方法的默認配置驗證從位於「syste.web/httRuntime」 requestPathInvalidCharactersArray屬性的默認的web.config設定輸入時設定的缺省值是:

<,>, *,%,&,:,\ ,?

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

正如你可以看到「<」被視爲無效的路徑,而「<一個」將被視爲無效輸入,這就是爲什麼你會得到兩種行爲。

如果你對我如何解決這個問題感到好奇,我只查看了validate helper方法的源代碼,並將其返回到源代碼。

[編輯]

ValidateInputIfRequiredByConfig方法示出了其擲400

[EDIT 2]

public NameValueCollection QueryString 
    { 
     get 
     { 
      this.EnsureQueryString(); 
      if (this._flags[1]) 
      { 
       this._flags.Clear(1); 
       this.ValidateHttpValueCollection(this._queryString, RequestValidationSource.QueryString); 
      } 
      return this._queryString; 
     } 
    } 

呼叫至該屬性撞ValidateHttpValueCollection可以驗證查詢字符串如果驗證源是Querystring,它在這個屬性中。

在這種方法中有一種叫做ValidateString的方法。在ValidateString中,它確定它是否是有效的字符串,如果不是,它會拋出HttpRequestValidationException

+0

我不相信這是正確的。查看堆棧跟蹤並將其與.Net [源代碼](http://referencesource.microsoft.com/#System.Web/HttpRequest.cs)進行引用,可以清楚地看到異常是在'ValidateInputIfRequiredByConfig ()'。我需要知道的是,爲什麼會拋出500狀態代碼錯誤,而不是預期的400? – Digbyswift 2015-02-14 12:10:41

+0

一個是無效的路徑(在網址中),併產生一個400,因爲它無法找到,對吧?另一個是500,因爲它是無效輸入。代碼中拋出的代碼也反映了這一點。 – Hardrada 2015-02-14 15:24:05

+0

不,這只是不正確的。 400是一個不好的請求,不是「未找到」,並且方法中沒有任何內容拋出500異常,只有400。最後,2612行將捕獲這兩個路徑,因此會拋出2615行。那麼拋出500是什麼? – Digbyswift 2015-02-14 16:18:27