架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 86|回复: 2

[技巧] C#判断上传文件是否是图片,防止木马上传

[复制链接]
发表于 2019-3-14 17:26:59
方法一:用image对象判断是否为图片

  1. /// <summary>
  2.       /// 判断文件是否为图片
  3.       /// </summary>
  4.       /// <param name="path">文件的完整路径</param>
  5.       /// <returns>返回结果</returns>
  6.     public Boolean IsImage(string path)
  7.     {
  8.         try
  9.         {
  10.             System.Drawing.Image img = System.Drawing.Image.FromFile(path);
  11.             return true;
  12.         }
  13.         catch (Exception e)
  14.         {
  15.             return false;
  16.         }
  17.     }
复制代码
方法二,判断文件头

  1. /// <summary>
  2.      /// 根据文件头判断上传的文件类型
  3.      /// </summary>
  4.     /// <param name="filePath">filePath是文件的完整路径 </param>
  5.      /// <returns>返回true或false</returns>
  6.     private bool IsPicture(string filePath)
  7.     {
  8.         try
  9.         {
  10.             FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
  11.             BinaryReader reader = new BinaryReader(fs);
  12.             string fileClass;
  13.             byte buffer;
  14.             buffer = reader.ReadByte();
  15.             fileClass = buffer.ToString();
  16.             buffer = reader.ReadByte();
  17.             fileClass += buffer.ToString();
  18.             reader.Close();
  19.             fs.Close();
  20.             if (fileClass == "255216" || fileClass == "7173" || fileClass == "13780" || fileClass == "6677")

  21.                   //255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar
  22.             {
  23.                 return true;
  24.             }
  25.             else
  26.             {
  27.                 return false;
  28.             }
  29.         }
  30.         catch
  31.         {
  32.             return false;
  33.         }
  34.     }
复制代码
据说方法二针对常规修改的木马有效,也就是直接修改扩展名的,比如把.asp改成.jpg这种。但是对于那种用工具生成的jpg木马没有效果。推荐大家用第一种好了。




上一篇:充值以后软件不能用
下一篇:.Net内存溢出(System.OutOfMemoryException)的常见情况
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-3-14 21:53:46
  1. public bool IsAllowedExtension(HttpPostedFile fu)
  2.         {
  3.             int fileLen = fu.ContentLength;
  4.             byte[] imgArray = new byte[fileLen];
  5.             fu.InputStream.Read(imgArray, 0, fileLen);
  6.             MemoryStream ms = new MemoryStream(imgArray);
  7.             System.IO.BinaryReader br = new System.IO.BinaryReader(ms);
  8.             string fileclass = "";
  9.             byte buffer;
  10.             try
  11.             {
  12.                 buffer = br.ReadByte();
  13.                 fileclass = buffer.ToString();
  14.                 buffer = br.ReadByte();
  15.                 fileclass += buffer.ToString();
  16.             }
  17.             catch
  18.             {
  19.             }
  20.             finally
  21.             {
  22.                 br.Close();
  23.                 ms.Close();
  24.             }
  25.             //注意将文件流指针还原
  26.             fu.InputStream.Position = 0;
  27.             //255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar
  28.             if (fileclass == "255216" || fileclass == "7173" || fileclass == "13780" || fileclass == "6677")
  29.             {
  30.                 return true;
  31.             }
  32.             return false;
  33.         }
复制代码


这样就可以了。验证了文件的头信息,当然木马的制作也可以把头信息加入依然上传成功,此时应该需要我们的服务器必须控制上传文件的权限了。
  1. /// <summary>
  2.               /// 判断文件是否为图片
  3.               /// </summary>
  4.               /// <param name="path">文件的完整路径</param>
  5.               /// <returns>返回结果</returns>
  6.         public static Boolean IsImage(string path)
  7.         {
  8.             System.Drawing.Image img = null;
  9.             try
  10.             {
  11.                 img = System.Drawing.Image.FromFile(path);
  12.                 return true;
  13.             }
  14.             catch (Exception e)
  15.             {
  16.                 return false;
  17.             }
  18.             finally {
  19.                 if (img != null) img.Dispose();
  20.             }
  21.         }
复制代码


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 5 天前
  1. /// <summary>
  2.         /// 判断流是否为图片,并且存起来
  3.         /// </summary>
  4.         /// <param name="io"></param>
  5.         /// <param name="path"></param>
  6.         /// <returns></returns>
  7.         public static Boolean IsImageByStream(Stream io,string path)
  8.         {
  9.             System.Drawing.Image img = null;
  10.             try
  11.             {
  12.                 img = System.Drawing.Image.FromStream(io);
  13.                 //存放起来
  14.                 img.Save(path);
  15.                 return true;
  16.             }
  17.             catch (Exception e)
  18.             {
  19.                 return false;
  20.             }
  21.             finally
  22.             {
  23.                 //这里一定要判断,否则容易空指针
  24.                 if (img != null) img.Dispose();
  25.             }
  26.         }
复制代码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-3-26 04:23

Powered by Discuz! X3.4

© 2001-2014 Comsenz Inc.

快速回复 返回顶部 返回列表