2016-04-26 8 views
2

プロジェクトiでは、以下のコードを見ました。.xmlファイルと.csファイルのダウンロードを制限する

 string FileName = Request.QueryString["filename"]; 
     System.Web.HttpResponse response = System.Web.HttpContext.Current.Response; 
     response.ClearContent(); 
     response.Clear(); 
     response.ContentType = "application/octet-stream"; 
     response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";"); 
     response.TransmitFile(Server.MapPath("~/" + FileName)); 
     response.Flush(); 
     response.End(); 

これは、サーバーからファイルをダウンロードするために使用されます。今、誰かが手動でクエリ文字列のファイル名(web.configのような)を変更した場合、それはまた、設定ファイルをダウンロードします。

ファイルの拡張子に基づいてダウンロードを制限する方法を知ってください。

+1

サイトのルートからのダウンロードを許可しないでください。必ず専用の 'Files'、' Content'、 'Public'、' Uploads'エリアを使います。 –

+0

あなたは間違いなしです。しかし、この段階では、ソリューション全体で使用された回数が変わるため、変更できません。 – NJadon

答えて

3

これは通常IISで行われます。あなたがプログラム的にしたい場合は、すべての

string[] forbiddenExtensions = new string[] {".config", ".abc", ".xml" }; 
FileInfo fi = new FileInfo(FileName); 
if (forbiddenExtensions.Contains(fi.Extension)) 
{ 
    //throw some error or something... 
} 
+0

設定ファイルやIISの設定によっては可能ですか?私はコードを変更したくありません。 – NJadon

+0

[this](https://technet.microsoft.com/en-us/library/cc770504%28v=ws.10%29.aspx)はあなたを助けることができます** **しかし**あなたは間違いなくファイルを特定のフォルダやリファクタリングすることができます。時間をかけてそれらの穴を修正してください... – Nino

+0

.config拡張子はMIMEタイプのリストにありません。 – NJadon

0

まず、あなたは、ユーザーがファイルシステム上に存在するファイルをダウンロードできるようにするコードを記述するかどうかを自問する必要があります。 Webサーバー自体は、ファイルのダウンロードを処理し、共有すべきではないファイルへのアクセスを完全に防ぎます。

たとえば、ダウンロードするたびにコードを実行する必要がある場合など、代わりにcreating a handlerをご覧ください。その後、Webサーバーは、悪意のあるユーザーが機密ファイルをダウンロードするのを防ぐために、最初にアクセス許可などを決定します。許可されると、コードはダウンロード前に実行されます。

言われているように、Webルートからダウンロードするためにファイルを提供する必要はありません。代わりに、 "Downloads"という専用のディレクトリを作成し、そこからダウンロードするファイルをホストします。次にfilename = Path.GetFileName(filename)を使用して、ユーザーがそのディレクトリの外をナビゲートするのを防ぎます(..および/または\を使用)。

関連する問題