asp.Netアップロードファイル検出タイプ

6374 ワード

アップロードファイルの検出タイプはこれまで3種類しか見たことがありません.1つ目は検出ファイルの接尾辞名です.2つ目は検出ファイルのヘッダ符号化であり、異なるタイプのファイルのヘッダ符号化は異なる(例えば255,216はjpg、7173はgif、6677はBMP、13780はPNG、7790はexe、8297はrarなど).3つ目は、検出ファイルのMIMEコンテンツタイプです.この文章のコードには多くの参考ネットワークがありますので、ここで説明します.
フロントファイル:3つの方法のフロントファイルは同じです.
<%@ Page Language="C#" AutoEventWireup="true"   CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
     <title> </title>
</head>
<body>
     <form id="form1" runat="server">
     <div>
         <asp:FileUpload ID="FileUpload1" runat="server" />
         <asp:Button ID="btn_upload" runat="server" OnClick="btn_upload_Click" Text=" " />
     </div>
     </form>
</body>
</html>

バックグラウンドファイル:第1の方法:安全性は第2の方法に比べて低く、テキストファイルを1.txtを1に変更する.jpgはそのままアップロードできますが、その実現方法は分かりやすく、実現も簡単なので、ネット上ではこのような方法が多いです.
public partial class _Default : System.Web.UI.Page 

{

     protected void btn_upload_Click(object sender, EventArgs e)

     {

         Boolean fileOk = false;

         string path = Server.MapPath("~/images/");

         //          

         if (FileUpload1.HasFile)

         {

             //        ,      

             string fileExtension = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();

             //      jpg gif  

             string[] allowExtension = { ".jpg", ".gif" };

             //                

             for (int i = 0; i < allowExtension.Length; i++)

             {

                 if (fileExtension == allowExtension[i])

                 {

                     fileOk = true;

                     break;

                 }

             }

         }

         else

         {

             Response.Write("<script>alert('        ');</script>");

         }

         //         ,   

         if (fileOk)

         {

             FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);

             Response.Write("<script>alert('    ');</script>");

         }

     }

}


第2の方法は、本当の意味でのファイルタイプ判断を実現することができる.
public partial class _Default : System.Web.UI.Page 

{

      protected void btn_upload_Click(object sender, EventArgs e)

     {

         try

         {

             //          

             if (FileUpload1.HasFile)

             {

                 if (IsAllowedExtension(FileUpload1))

                 {

                     string path = Server.MapPath("~/images/");

                     FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);

                     Response.Write("<script>alert('    ');</script>");

                 }

                 else

                 {

                     Response.Write("<script>alert('     jpg  gif  ');</script>");

                 }



             }

             else

             {

                 Response.Write("<script>alert('        ');</script>");

             }

         }

         catch (Exception error)

         {

             Response.Write(error.ToString());

         }

     }

     //             

     public static bool IsAllowedExtension(FileUpload hifile)

     {

         System.IO.FileStream fs = new System.IO.FileStream(hifile.PostedFile.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);

         System.IO.BinaryReader r = new System.IO.BinaryReader(fs);

         string fileclass = "";

        //          .

         byte buffer;

         try

         {

             buffer = r.ReadByte();

             fileclass = buffer.ToString();

             buffer = r.ReadByte();

             fileclass += buffer.ToString();



         }

         catch

         {



         }

         r.Close();

         fs.Close();

         if (fileclass == "255216" || fileclass == "7173")//  255216 jpg;7173 gif;6677 BMP,13780 PNG;7790 exe,8297 rar

         {

             return true;

         }

         else

         {

             return false;

         }



     }

}


しかし、欠点はFileStreamがローカルファイルのみにアクセスでき、リモートファイルにアクセスできないことです(上級者に教えてもらいます).本人はローカルテストで問題ありませんが、サーバーに転送するとエラーが発生し、ファイルが見つからないことを示します.最後にシステムをIO.FileStream fs = new System.IO.FileStream(hifile.PostedFile.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);システムに変更IO.Stream fs = hifile.PostedFile.InputStream;だめです.仕方なくこの方法をあきらめるしかない.
 
 
第三の方法は、実は第一の方法の改善であり、テキストファイルを1.txtを1に変更する.jpgはアップロードできなくなり、ファイル接尾辞ではなくファイルMIMEコンテンツタイプを検出します.
public partial class _Default : System.Web.UI.Page 

{

     protected void btn_upload_Click(object sender, EventArgs e)

     {

         Boolean fileOk = false;

         string path = Server.MapPath("~/images/");

         //          

         if (FileUpload1.HasFile)

         {

             //    MIME    

              string type = this.uploadfile.PostedFile.ContentType.ToLower();

              if (type.Contains("image"))    //   MIME   "image/xxx",         。

              {

                     fileOk = true;

              }

         }

         else

         {

             Response.Write("<script>alert('        ');</script>");

         }

         //         ,   

         if (fileOk)

         {

             FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);

             Response.Write("<script>alert('    ');</script>");

         }

     }

}


 
まとめ:方法1は簡単だが、安全性が足りない.方法2セキュリティは問題ありませんが、FileStreamはリモートファイルにアクセスできません.方法3の安全性は方法2に相当するべきで、しかも実現も簡単で、使用を提案します.