有没有办法识别一个被篡改过后缀的文件的原始类型 例如说,某个.EXE被人改成了.RAR 或者 .DOC 或者干脆删除了后缀名那么在有没有办法猜测出该文件的原始类型?求思路! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是你自己颁发的文件格式,你可以要求文件根据某种你自己定义的标准来存储。比如 Gif 图片的首三个(偶见六个)都是 GIF 字样如果是任意类型的文件,没有什么特别的办法:文件说到底都是字节流,谁也没法规定哪种样子的流就必须是某种类型。典型的 windows 应用,如 word、windows media player 等软件,你把任意文件改为它们接受的后缀,如 .docx 或 .wma,它们照读不误——只是当发现试图读的时候出现错误,这才发现这原来是一个错误的文件(Bad Format)此外,通常情况下,一个 mp3 音频文件的后缀被改成了 wma,播放器还是能放因此,对于任意文件并没有办法来猜测它的原始类型,甚至很多文件干脆没有原始类型(比如随便一个流) 前10个字节using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;public partial class test_TrueFile : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { } /// <summary> /// C#检测真实文件类型函数 /// </summary> /// <param name="hifile"></param> /// <returns></returns> private bool IsAllowedExtension(HttpPostedFile hifile) { bool ret = false; System.IO.FileStream fs = new System.IO.FileStream(hifile.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 { return false; } r.Close(); fs.Close(); /*文件扩展名说明 *4946/104116 txt *7173 gif *255216 jpg *13780 png *6677 bmp *239187 txt,aspx,asp,sql *208207 xls.doc.ppt *6063 xml *6033 htm,html *4742 js *8075 xlsx,zip,pptx,mmap,zip *8297 rar *01 accdb,mdb *7790 exe,dll *5666 psd *255254 rdp *10056 bt种子 *64101 bat *4059 sgf */ //String[] fileType = { "255216", "7173", "6677", "13780", "8297", "5549", "870", "87111", "8075" }; //纯图片 String[] fileType = { "7173", //gif "255216", //jpg "13780" //png }; for (int i = 0; i < fileType.Length; i++) { if (fileclass == fileType[i]) { ret = true; break; } } Response.Write(fileclass);//可以在这里输出你不知道的文件类型的扩展名 return ret; } protected void btnOk_Click(object sender, EventArgs e) { if (IsAllowedExtension(uploadFile.PostedFile)) { Response.Write("ok"); } }}格式参考 上传时可以判断 //取得文件MIME内容类型 string type = this.fuImage.PostedFile.ContentType.ToLower(); if (type.Contains("image"))//图片的MIME类型为"image/xxx",这里只判断是否图片 我倒是搜索出个软件TrIDNethttp://tech.163.com/07/0727/08/3KD75U8D000917GQ.html下载地址:http://download.csdn.net/source/3017082它里面附带了770个XML,对应了770个后缀。配合3楼的大师的代码便可以解决问题了非常感谢! 跪求答案 公司只有设计没有美工,切图排版、数据添加后期维护要自己做,我是不是要离开呢?大家的看法呢? JS如何得到后台CS中方法返回的值??????????? webconfig文件中的connectionstrings有特殊字符时的问题 IIS如何配置? 急,一个简单的问题,Aspx如果实现文件下载,并且改变文件名。 带有 CLSID {F812B147-0E26-4222-8EE4-9F753CD2B39C} 的 COM 对象无效或未注册。 遇到一个OA的问题,不明所以。 一个水晶报表的问题,登陆失败 关于listbox .NET 项目提交数据“溢出”报错 Oracle报错——无效字符
典型的 windows 应用,如 word、windows media player 等软件,你把任意文件改为它们接受的后缀,如 .docx 或 .wma,它们照读不误——只是当发现试图读的时候出现错误,这才发现这原来是一个错误的文件(Bad Format)此外,通常情况下,一个 mp3 音频文件的后缀被改成了 wma,播放器还是能放因此,对于任意文件并没有办法来猜测它的原始类型,甚至很多文件干脆没有原始类型(比如随便一个流)
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class test_TrueFile : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
/// <summary>
/// C#检测真实文件类型函数
/// </summary>
/// <param name="hifile"></param>
/// <returns></returns>
private bool IsAllowedExtension(HttpPostedFile hifile)
{
bool ret = false; System.IO.FileStream fs = new System.IO.FileStream(hifile.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
{
return false;
}
r.Close();
fs.Close();
/*文件扩展名说明
*4946/104116 txt
*7173 gif
*255216 jpg
*13780 png
*6677 bmp
*239187 txt,aspx,asp,sql
*208207 xls.doc.ppt
*6063 xml
*6033 htm,html
*4742 js
*8075 xlsx,zip,pptx,mmap,zip
*8297 rar
*01 accdb,mdb
*7790 exe,dll
*5666 psd
*255254 rdp
*10056 bt种子
*64101 bat
*4059 sgf
*/
//String[] fileType = { "255216", "7173", "6677", "13780", "8297", "5549", "870", "87111", "8075" }; //纯图片
String[] fileType = {
"7173", //gif
"255216", //jpg
"13780" //png
}; for (int i = 0; i < fileType.Length; i++)
{
if (fileclass == fileType[i])
{
ret = true;
break;
}
}
Response.Write(fileclass);//可以在这里输出你不知道的文件类型的扩展名
return ret;
}
protected void btnOk_Click(object sender, EventArgs e)
{
if (IsAllowedExtension(uploadFile.PostedFile))
{
Response.Write("ok");
}
}
}
格式参考
string type = this.fuImage.PostedFile.ContentType.ToLower(); if (type.Contains("image"))//图片的MIME类型为"image/xxx",这里只判断是否图片
http://tech.163.com/07/0727/08/3KD75U8D000917GQ.html
下载地址:
http://download.csdn.net/source/3017082
它里面附带了770个XML,对应了770个后缀。配合3楼的大师的代码便可以解决问题了非常感谢!