1

別のサーバー上のファイル共有にマップする仮想ディレクトリ (/ArticleImages) を含む dotnet サイトがあります。ファイル共有には多数の人がアクセスできるため、セキュリティ対策として、このフォルダーで asp.net ページを実行したくありません (たとえば、ファイル共有に default.aspx を配置し、site.com/ArticleImages を参照します)。 /default.aspx は機能しないか、できれば実行ではなく単純なダウンロードとして機能する必要があります)。

IIS 6.0 を使用しており、仮想ディレクトリを追加しました。このフォルダーからアプリケーションを削除すると、親アプリケーションが使用され、web.config を読み取れないというエラーが表示されます。このフォルダーにアプリケーションを追加すると、すべてのアプリケーション拡張機能を削除しても、svc-xyzzy (共有へのアクセスに使用されるアカウント) に「C:\WINDOWS\Microsoft.NET\Framework\」へのアクセス権がないというエラーが表示されます。 v2.0.50727\Temporary ASP.NET Files'.

dotnet コードを実行しないアプリケーションのサブ フォルダーを作成するにはどうすればよいですか?

4

2 に答える 2

1

アプリ プールが実行されているユーザー (既定ではネットワーク サービス) がファイル共有を読み取ることができる場合は、仮想ディレクトリを完全に削除し、ファイルをブラウザーにストリーミングする ASP.NET アプリケーションを作成できます。MVC を使用している場合は、ファイルの結果を返すだけです。これには、ユーザーがファイルをダウンロードするのを制限できるという追加の利点があります。つまり、ユーザーがログインしているか、ファイルをダウンロードするための特定の権限を持っていることを要求できます。また、パス トラバーサルをテストしてください。ユーザーが ../../filename を入力して、許可されていないファイルをダウンロードすることは望ましくありません。

オプション 1: ASP.NET MVC

public ActionResult Download(string file)
{
    // Check for directory traversal attack
    if(file.IndexOf('\\') > -1 || file.IndexOf('/') > -1)
    {
        return new HttpNotFoundResult();
    }

    file = System.IO.Path.Combine("\\FILE_SHARE_FOLDER\\", file);

    if(!System.IO.File.Exists(file))
    {
        return new HttpNotFoundResult();                
    }

    return this.File(file, GetMimeType(file));
}

オプション 2: Web フォーム

private void DownloadFile(string file)
{
    // Check for directory traversal attack
    if(file.IndexOf('\\') > -1 || file.IndexOf('/') > -1)
    {
        Response.StatusCode = 404;
        Response.End();
    }

    file = System.IO.Path.Combine("\\FILE_SHARE_FOLDER\\", file);

    if (!System.IO.File.Exists(file))
    {
        Response.StatusCode = 404;
        Response.End();
    }

    Response.ContentType = GetMimeType(file);
    Response.TransmitFile(file);
}

MVC と Web フォームの両方の MIME タイプを取得するためのメソッドが必要になります ( MIME Type Method From KodeSharp )

private string GetMimeType(string fileName)
{
    string mimeType = "application/unknown";
    string ext = System.IO.Path.GetExtension(fileName).ToLower();
    Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
    if (regKey != null && regKey.GetValue("Content Type") != null)
        mimeType = regKey.GetValue("Content Type").ToString();
    return mimeType;
} 
于 2012-11-03T06:17:26.380 に答える
0

リクエストをチェックしglobal.asaxて、許可していないディレクトリからのものである場合は、次のように処理を停止します。

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    string cTheFile = HttpContext.Current.Request.Path;

    if(cTheFile.StartsWith("/articleimages", StringComparison.CurrentCultureIgnoreCase)
    {
        HttpContext.Current.Response.TrySkipIisCustomErrors = true;
        HttpContext.Current.Response.Write("Please start from home page");
        HttpContext.Current.Response.StatusCode = 403;
        HttpContext.Current.Response.End();
        return ;
    }   
}

もちろんweb.config、これを内部に追加して、ディレクトリに1つ追加するだけです。

<configuration>
    <system.web>
      <authorization>
        <deny users="*" />
      </authorization>
    </system.web>
</configuration>

しかし、彼らが削除できる場合、それはコードとして役に立ちません。

于 2012-11-02T22:26:05.067 に答える