許可が設定されているときにブラウザから直接ファイルをダウンロードしないようにする方法[read = allow]

私は以下のようなファイルをダウンロードするためのハンドラを持っています:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using NiceFileExplorer.Classes;

namespace NiceFileExplorer
{
    /// 
/// Summary description for HandlerForMyFE
///
 
    public class HandlerForMyFE : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {
        private HttpContext _context;
        private HttpContext Context
        {
            get
            {
                return _context;
            }
            set
            {
                _context = value;
            }
        }

        public void ProcessRequest(HttpContext context)
        {
            Context = context;
            string filePath = context.Request.QueryString["Downloadpath"];
            filePath = context.Server.MapPath(filePath);

            if (filePath == null)
            {
                return;
            }

            System.IO.StreamReader streamReader = new System.IO.StreamReader(filePath);
            System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(streamReader.BaseStream);

            byte[] bytes = new byte[streamReader.BaseStream.Length];

            binaryReader.Read(bytes, 0, (int)streamReader.BaseStream.Length);

            if (bytes == null)
            {
                return;
            }

            streamReader.Close();
            binaryReader.Close();

            string fileName = System.IO.Path.GetFileName(filePath);
            string MimeType = GetMimeType(fileName);
            string extension = System.IO.Path.GetExtension(filePath);
            char[] extension_ar = extension.ToCharArray();
            string extension_Without_dot = string.Empty;
            for (int i = 1; i < extension_ar.Length; i++)
            {
                extension_Without_dot += extension_ar[i];
            }

            string filesize = string.Empty;
            FileInfo f = new FileInfo(filePath);
            filesize = f.Length.ToString();

            if (HttpContext.Current.Session["User_ID"] != null)
            {
                WriteFile(bytes, fileName, filesize, MimeType + " " + extension_Without_dot, context.Response);
            }

        }

        private void WriteFile(byte[] content, string fileName, string filesize, string contentType, HttpResponse response)
        {
            response.Buffer = true;
            response.Clear();

            response.ContentType = contentType;

            response.AddHeader("content-disposition", "attachment; filename=" + fileName);

            response.AddHeader("Content-Length", filesize);

            response.BinaryWrite(content);
            response.Flush();
            response.End();
        }

        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;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

このハンドラの重要な部分はWriteFileで、完璧に動作します!
私はこのハンドラを以下のようなコードのファイルからダウンロードするように呼び出します:

Response.Redirect("~/Handler.ashx?Downloadpath=" + HttpUtility.UrlEncode(DownloadPath));

私のウェブサイトの私のダウンロードリンクの1つは以下のようです:

http://localhost:5410/en/Download.aspx?Downloadpath=%2fFiles%2f%2fsamsung%2fGE2550_DEFAULT_MDL_V002.exe

だから、私はそのハンドラでダウンロードリンクを簡単に操作できます!

私の問題は、いくつかのボディがそのリンクを変更するときです:

http://localhost:5410/Files/samsung/GE2550_DEFAULT_MDL_V002.exe  

can download that file directly without that
handler!

どのように私はこの直接のダウンロードを防ぐことができますか?

前もって感謝します

ベストアンサー

最初に、実際の物理パスをファイルに入れてクエリー文字列に入れるのは良い考えではありません。パブリックにあまりにも多くの情報を与え、人々が予期しないパスをURLに入れて他のファイルをダウンロードしようとするセキュリティ問題にあなたを導きます。

上記の問題に関しては、FilesフォルダをWebルートの外に置いてブラウザからアクセスできないようにするか、IISがそのフォルダ(およびサブフォルダ)へのアクセスを許可されないように設定する必要があります。
ASP.NETが実行されているアカウントには、そのフォルダに対するアクセス許可が与えられている限り、IISで表示可能かどうかにかかわらず、コード内でファイルを開いて応答に書き込むことができます。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です