ASP.Netアップロードファイルのタイプを判断する3つの有効な方法

3502 ワード

一、安全性が低い、テキストファイル1をtxtを1に変更する.jpgはそのままアップロードできますが、その実現方法は分かりやすく、実現も簡単なので、ネット上ではこのような方法が多いです.


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" };
//
int j = 0;
for (int i = 0; i < allowExtension.Length; i++)
{
if (fileExtension == allowExtension[i])
{
fileOk = true;
return;
}
else
{
j++;
}
}
if (j > 0)
{
Response.Write("alert(' ');");
return;
}
}
else
{
Response.Write("alert(' ');");
return;
}
// ,
if (fileOk)
{
FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);
Response.Write("alert(' ');");
}
二、ファイル接尾辞を検出するのではなく、ファイルMIMEの内容タイプを検出する.


Boolean fileOk = false;
string path = Server.MapPath("~/images/");
//
if (FileUpload1.HasFile)
{
// MIME
string type = this.FileUpload1.PostedFile.ContentType.ToLower();
if (type.Contains("image")) // MIME "image/xxx", 。
{
fileOk = true;
}
else
{
Response.Write("alert(' ')");
}
}
else
{
Response.Write("alert(' ');");
}
// ,
if (fileOk)
{
FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);
Response.Write("alert(' ');");
}
三、本当の意味でのファイルタイプ判断を実現できる


try
{
//
if (FileUpload1.HasFile)
{
if (IsAllowedExtension(FileUpload1))
{
string path = Server.MapPath("~/images/");
FileUpload1.PostedFile.SaveAs(path + FileUpload1.FileName);
Response.Write("alert(' ');");
}
else
{
Response.Write("alert(' jpg gif ');");
}
}
else
{
Response.Write("alert(' ');");
}
}
catch (Exception error)
{
Response.Write(error.ToString());
}
#endregion
}
//
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;
}
}