asp.Netアップロードファイル検出タイプ
6374 ワード
アップロードファイルの検出タイプはこれまで3種類しか見たことがありません.1つ目は検出ファイルの接尾辞名です.2つ目は検出ファイルのヘッダ符号化であり、異なるタイプのファイルのヘッダ符号化は異なる(例えば255,216はjpg、7173はgif、6677はBMP、13780はPNG、7790はexe、8297はrarなど).3つ目は、検出ファイルのMIMEコンテンツタイプです.この文章のコードには多くの参考ネットワークがありますので、ここで説明します.
フロントファイル:3つの方法のフロントファイルは同じです.
バックグラウンドファイル:第1の方法:安全性は第2の方法に比べて低く、テキストファイルを1.txtを1に変更する.jpgはそのままアップロードできますが、その実現方法は分かりやすく、実現も簡単なので、ネット上ではこのような方法が多いです.
第2の方法は、本当の意味でのファイルタイプ判断を実現することができる.
しかし、欠点は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コンテンツタイプを検出します.
まとめ:方法1は簡単だが、安全性が足りない.方法2セキュリティは問題ありませんが、FileStreamはリモートファイルにアクセスできません.方法3の安全性は方法2に相当するべきで、しかも実現も簡単で、使用を提案します.
フロントファイル: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に相当するべきで、しかも実現も簡単で、使用を提案します.