0

私が見ている特に奇妙なエラーの原因について、いくつかの洞察を得ようとしています。問題を次のように切り分けました。

2 つの基本コントローラーを使用して ASP.Net MVC アプリケーションを作成します。

public class HasLocationController : Controller
{
   public ActionResult Index()
   {
      return View();
   }
}

public class NoLocationController : Controller
{
   public ActionResult Index()
   {
      return View();
   }
}

パス 'HasLocation' の場所要素を web.config に追加します。

<location path="HasLocation">
   <system.web>
      <authorization>
         <allow users="*"/>
      </authorization>
   </system.web>
</location>

サイトを IIS6 または IIS7 (IISExpress および WebDevServer は機能しません)に発行し、次のリンクを使用して参照を試みます。

http://[yourdomain]/NoLocation/%20~C:/blah.txt

http://[yourdomain]/HasLocation/%20~C:/blah.txt

対応する場所要素が構成されていないコントローラーの場合、予想される種類の例外メッセージが表示されます。


場所要素のないコントローラーからの例外


ただし、コントローラーで location 要素を使用して同じことを試みると、次の奇妙なエラーが発生します。

注:これは先頭のチルダ (~) 文字でのみ発生します。それがなければ、期待する通常のエラーが発生します。


ロケーション要素使用時のエラー


このエラーに関するドキュメントを実際に見つけることはできませんでしたが、なぜこれが起こっているのか、そしてそれを防ぐ方法を理解したいと思っています.

この問題にあなたが当てることができるどんな光も役に立ちます。

4

2 に答える 2

3

このエラーに関して、インターネット上には事実上何百もの答えがあります。ほとんどの場合、コントローラーとはまったく関係ありませんが、次のこととは関係ありません。

〜C:/blah.txt

具体的には、:おそらく危険であると思われるものです。HttpRuntimeSection.RequestPathInvalidCharactersを見てください。

2番目のエラーも。正解です。ディレクトリHasLocationはプロジェクトに存在しません。作成すると、最初のエラーが発生します。を削除する:と、ディレクトリに要求したファイルをロードしようとしますHasLocation

注:MVCアプリケーションコントローラーのセキュリティを確保するためにweb.configのlocation要素を使用しないでください。AuthorizeAttributeまたはそのような他のカスタム属性を使用する必要があります

これがリファレンスであり、SOまたはGoogleを検索しても、ほぼ同じことが言えます。

ルーティングファイルまたはweb.configファイルを使用してMVCアプリケーションを保護することはできません。MVCアプリケーションを保護するためにサポートされている唯一の方法は、[Authorize]属性を持つ基本クラスを使用し、各コントローラータイプにその基本タイプのサブクラスを設定することです。

何が起こっているかを言い換えます。

最初のエラーHttpRuntimeSection.RequestPathInvalidCharactersが原因でURLがエラーをスローしています。

2番目のエラー:コントローラーがあるかどうかは関係ありません。デフォルトのASP.NetWebformsエンジンは、Web.configで指定したWebformsエンジンのディレクトリアクセスを承認する必要があるため、URLで指定したディレクトリ(この場合はHasDirectoryというディレクトリ)が存在するかどうかを検出しようとしています。ロケーション要素。まだファイルについては心配していません。このディレクトリは存在しないため、画像の状態とまったく同じようにエラーが発生します(緑色で強調表示しています)。

強調表示されたエラー

ディレクトリを作成すると、エラー#1が発生します。

ASP.Netランタイム全体は、次のようなことを行います。

  1. リクエストに必要なパスを解析します。
  2. ディレクトリがweb.configロケーション要素に存在する場合は、ディレクトリに対する承認を検証します。
  3. アクセスできる場合は、ファイルを取得して、ファイルが何であれ(aspxなど)解析します。
  4. アクセス権がなく、ファイルが存在する場合は、設定どおりに例外をスローするか、リダイレクトします。
  5. ファイルが存在しない場合は、web.configのlocation要素を無視し、IIS catch allを実行して、要求に別のルートがあるかどうかを判断します。
于 2012-06-08T21:14:11.387 に答える
0

URL のチルダが、仮想パス プロバイダーをだまして物理ディスク上のそのコントローラーを検索させていると思います。

于 2012-06-09T01:34:56.803 に答える