アプリ プールが実行されているユーザー (既定ではネットワーク サービス) がファイル共有を読み取ることができる場合は、仮想ディレクトリを完全に削除し、ファイルをブラウザーにストリーミングする 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;
}