上传文件判断类型的问题

万载馨辰 2011-12-15 06:28:18

public enum FileExtension
{
JPG = 255216,
GIF = 7173,
PNG = 13780,
SWF = 6787,
RAR = 8297,
ZIP = 8075,
_7Z = 55122,
BMP=6677,
EXE=7790,
XML=6063,
HTML=6033,
ASPX=239187,
CS=117115,
JS=119105,
TXT=102100

}
public static bool IsAllowedExtension(HttpPostedFile fu, FileExtension[] fileEx)
{
int fileLen = fu.ContentLength;
byte[] imgArray = new byte[fileLen];
fu.InputStream.Read(imgArray, 0, fileLen);
MemoryStream ms = new MemoryStream(imgArray);
System.IO.BinaryReader br = new System.IO.BinaryReader(ms);
string fileclass = "";
byte buffer;
try
{
buffer = br.ReadByte();
fileclass = buffer.ToString();
buffer = br.ReadByte();
fileclass += buffer.ToString();
}
catch
{
}
br.Close();
ms.Close();
foreach (FileExtension fe in fileEx)
{
if (Int32.Parse(fileclass) == (int)fe)
return true;
}
return false;
}

上面是定义,下面是调用

if (postedfile != null)
{
if (!Tools.Verification.IsAllowedExtension(postedfile, fe))
{
if (target != "")
{
if (System.IO.File.Exists(HttpContext.Current.Server.MapPath(target)))
{
System.IO.File.Delete(HttpContext.Current.Server.MapPath(target));
err = "文件非法!!!";
}
}
}
}


下面调用 的代码,我一开始放在获取文件流之后立即判断,但发现存入服务器之后图片坏了
于是又改成了存入服务器之后再判断,可是图片还是坏了
但是把下面这段代码注释掉之后图片又正常了,这到底啥意思?
...全文
162 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
万载馨辰 2011-12-18
  • 打赏
  • 举报
回复
那到底如何才可以限制文件类型?
  • 打赏
  • 举报
回复
我不是说到要判断MIME类型吗?

即使你判断MIME类型也不是够的,MIME也是可以修改 的。
万载馨辰 2011-12-16
  • 打赏
  • 举报
回复
那好吧,几位大神,我只想问下,所谓的上传漏洞到底指的是什么?只限制扩展名安全吗?楼上的那个,是个程序员就会知道至少要这么做
net5354 2011-12-16
  • 打赏
  • 举报
回复
不要那么复杂的就可以了:
if (FileUpload1.HasFile)
{
fileExt = System.IO.Path.GetExtension(FileUpload1.FileName);
if (fileExt == ".rar" || fileExt == ".zip")
{

}
else
{

}
}
万载馨辰 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hdt 的回复:]

指出几个小问题
fu.InputStream.Read(imgArray, 0, fileLen);
这里面读完后,当前流的指针发生改变,后面再用会发生错误
buffer = br.ReadByte();
fileclass += buffer.ToString();//把byte转为string,后面再转回int比较,代码相当垃圾
……
[/Quote]

这是到网上复制的一段代码····好像还是高手写的····
真相重于对错 2011-12-15
  • 打赏
  • 举报
回复
指出几个小问题
fu.InputStream.Read(imgArray, 0, fileLen);
这里面读完后,当前流的指针发生改变,后面再用会发生错误
buffer = br.ReadByte();
fileclass += buffer.ToString();//把byte转为string,后面再转回int比较,代码相当垃圾
}
catch
{
}
br.Close();
ms.Close();
foreach (FileExtension fe in fileEx)
{
if (Int32.Parse(fileclass) == (int)fe)
return true;
}
万载馨辰 2011-12-15
  • 打赏
  • 举报
回复

private static string[] FileExtension=new string[]{"application/msword","application/pdf","application/vnd.ms-powerpoint","application/x-shockwave-flash","application/zip","image/bmp","image/gif","image/jpeg","text/plain",};

public static bool IsAllowedExtension(HttpPostedFile fu)
{
for (int i = 0; i < FileExtension.Length; i++)
{
if (fu.ContentType.StartsWith(FileExtension[i]))
{
return true;
}
}
return false;
}

为什么mime判断无效?
万载馨辰 2011-12-15
  • 打赏
  • 举报
回复
好像contenttype改不了···唉···郁闷···
万载馨辰 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chromev8 的回复:]

晕这样写是不是太复杂了点??
System.IO.Path.GetExtension这样就可以读取扩展名
HttpPostedFile.ContentType这样就可以获取MIME类型

扩展名与MIME类型是有对应关系的。。。
MIME类型是唯一的,所以可以建一个键值集合,很容易就搞定了。
[/Quote]
第一个不说了,逃过去很容易
第二个,ContentType可以在注册表里面改
  • 打赏
  • 举报
回复
晕这样写是不是太复杂了点??
System.IO.Path.GetExtension这样就可以读取扩展名
HttpPostedFile.ContentType这样就可以获取MIME类型

扩展名与MIME类型是有对应关系的。。。
MIME类型是唯一的,所以可以建一个键值集合,很容易就搞定了。


万载馨辰 2011-12-15
  • 打赏
  • 举报
回复
怎么没人回答啊

62,266

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧