3

私は、ほとんどの例外を適切に処理するアプリケーションを作成しました。ページのデザインはそのままで、かなりのエラーメッセージが表示されます。私のアプリケーションはイベントでそれらすべてをキャッチしPage_Error、そこで例外を追加しHttpContext.Curent.Context.ItemsServer.TransferからError.aspxページに実行します。一元化された一般的な方法でそれを行う他の方法はないように思われるので、これがASP.NETで唯一の実行可能なソリューションであることがわかりました。

私も処理しApplication_Error、そこで発生した例外を検査して、正常に処理できるかどうかを確認します。私が適切に処理できることがわかった例外は、誰かがURIをハッキングして文字を含むようにした後にスローされるものです。.NETFrameworkは、ファイルシステムレベルで危険または基本的に違法であると見なします。

このようなURIは、次のようになります。

  • http://exmample.com/"illegal"
  • http://example.com/illegal"/
  • http://example.com/illegal /

(最後のURIの最後にあるスラッシュの前のスペースに注意してください)。

これらのURIは、「404 Not Found」とわかりやすいメッセージで応答し、DDOS攻撃ベクトルなどを回避するためにエラーレポートが送信されないようにしたいと思います。ただし、これらのタイプのエラーをキャッチするためのエレガントな方法は見つかりませんでした。私が今していることは、プロパティを検査することです。それが、、またはにexception.TargetSite.Name等しい場合、それを「パス検証例外」と見なし、404で応答します。CheckInvalidPathCharsValidatePathCheckSuspiciousPhysicalPath

ただし、これはハックのようです。まず、メソッド名のリストはおそらく完全ではありません。次に、これらのメソッド名が置き換えられたり、名前が変更されたりして、コードが破損する可能性があります。

このハードコーディングが少なく、将来性のある方法をどのように処理できるか、誰かが考えていますか?

PS:System.Web.Routing特定のソリューションにとって重要な場合は、アプリケーションでクリーンで適切なURIを使用しています。

4

3 に答える 3

3

System.Web.Routingが何らかのURLフィルタリングをサポートしている可能性がありますが、独自のURLフィルタリングを実装するのは非常に簡単です。

System.Web.IHttpModuleインターフェースを見て、カスタムHTTPモジュールの実装について読んでください。HttpモジュールはそのAsp.Netパイプラインに入り、ページが実行される前に実行されます。これを使用して、リクエストのロギングを実行したり、リクエストを変更したり、場合によってはリクエストをフィルタリングしたりできます。Asp.Netルーティングモジュールは、カスタムHTTPモジュールとしても実装されています。

できることは、要求されたURLを調べてそれが有効かどうかを確認するHttpモジュールを実装することです。URLが無効な場合は、必要な操作を行うことができます。たとえば、404-not foundページにリダイレクトするか、リクエストを停止するだけです。

于 2009-02-27T09:35:55.607 に答える
1

System.Web.IHttpModule を使用することが IIS7+ の正しい答えだとは思いません。パスを検証するために IHttpModule を実装しようとしていますが、HttpModule が実行される前に例外がスローされました。

これは私の例外スタックです:

   [ArgumentException: Illegal characters in path.]
   System.IO.Path.CheckInvalidPathChars(String path) +7493413
   System.IO.Path.Combine(String path1, String path2) +40
   System.Web.Configuration.UserMapPath.GetPhysicalPathForPath(String path, VirtualDirectoryMapping mapping) +114
   System.Web.Configuration.UserMapPath.GetPathConfigFilename(String siteID, VirtualPath path, String& directory, String& baseName) +72
   System.Web.Configuration.UserMapPath.MapPath(String siteID, VirtualPath path) +30
   System.Web.Configuration.UserMapPath.MapPath(String siteID, String path) +31
   System.Web.Hosting.HostingEnvironment.MapPathActual(VirtualPath virtualPath, Boolean permitNull) +297
   System.Web.Hosting.HostingEnvironment.MapPathInternal(VirtualPath virtualPath, Boolean permitNull) +51
   System.Web.CachedPathData.GetConfigPathData(String configPath) +341
   System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) +110
   System.Web.HttpContext.GetFilePathData() +36
   System.Web.HttpContext.GetConfigurationPathData() +26
   System.Web.Configuration.RuntimeConfig.GetConfig(HttpContext context) +43
   System.Web.Configuration.CustomErrorsSection.GetSettings(HttpContext context, Boolean canThrow) +41
   System.Web.HttpResponse.ReportRuntimeError(Exception e, Boolean canThrow, Boolean localExecute) +101
   System.Web.HttpRuntime.FinishRequest(HttpWorkerRequest wr, HttpContext context, Exception e) +383

これは、IIS 7.0 のアプリケーション ライフ サイクル ( http://msdn.microsoft.com/en-us/library/bb470252.aspx )へのリンクです。

「RESOLVE CACHE」ステップによって例外が発生したと推測しています

于 2010-02-28T05:14:35.223 に答える
0

カスタム HttpModule の記述はうまくいきませんでした。「パスに不正な文字があります」というエラーが引き続き表示されますが、この質問への回答で問題が解決しました。

web.Config の requestFiltering に allowDoubleEscaping="false" を設定することで、これを回避できることが判明しました。すなわち:

<configuration>
  <system.webServer>
    <security>
      <requestFiltering allowDoubleEscaping="false" />
    </security>
  </system.webServer>
</configuration>

おそらく完璧な解決策ではありませんが (より良い解決策の提案は大歓迎です)、問題は解決します。

于 2010-03-30T13:50:18.077 に答える