【100分】如何防范上传的图片包含恶意代码???求高手!!!

丰云 2013-01-07 02:18:09
如题,
公司要实现一个鉴证图片上传的功能,
但要防止有人在图片中附加恶意代码,
目前有一些基本的想法,
但感觉还是不够可靠,
有没有人做过这个功能的?
赐教一二啊
...全文
952 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Delta 2013-01-08
  • 打赏
  • 举报
回复
来学习过了,还真没遇到过这些问题啊
heycoder 2013-01-07
  • 打赏
  • 举报
回复
引用 3 楼 foren_whb 的回复:
引用 1 楼 heycoder 的回复:是为了防止php asp恶意程序伪装成图片么? 是的, 网上关于这块的资料很少, 一般都是从图片流中过滤关键字, 问题是我不知道这些关键字是否真的能把木马神马的都过滤掉。。。。
1.如果可以的话,服务器不要安装asp,php环境,这样即便有了asp木马又如何? 2.其他的杀软我是不知道。反正这种图片对于卡巴来说。连保存的机会都没有。。。
丰云 2013-01-07
  • 打赏
  • 举报
回复
引用 14 楼 free_wang 的回复:
你服务器的杀毒软件是摆设吗
这个。。。没想到。。。。
股神 2013-01-07
  • 打赏
  • 举报
回复
你服务器的杀毒软件是摆设吗
NqIceCoffee 2013-01-07
  • 打赏
  • 举报
回复
引用 12 楼 foren_whb 的回复:
但是菜鸟们下载图片后,双击打开。。。。就悲剧了, 所以这个办法只能保护图片服务器的安全, 还不够完美啊。。。。
这个只能通过你的业务去实现了吧 上传后,通过后台的服务去验证图片的真实性,不是真实的图片,不让下载
丰云 2013-01-07
  • 打赏
  • 举报
回复
引用 10 楼 KarasCanvas 的回复:
关键是做到让他们上传了也没办法运行。
但是菜鸟们下载图片后,双击打开。。。。就悲剧了, 所以这个办法只能保护图片服务器的安全, 还不够完美啊。。。。
joyhen 2013-01-07
  • 打赏
  • 举报
回复
/// <summary>
    /// 文件编号
    /// </summary>
    public enum FileExtension
    {
        JPG = 255216,
        GIF = 7173,
        BMP = 6677,
        PNG = 13780,
        //RAR = 8297
        // 255216 jpg;    
        // 7173 gif;    
        // 6677 bmp,    
        // 13780 png;    
        // 7790 exe dll,    
        // 8297 rar    
        // 6063 xml    
        // 6033 html    
        // 239187 aspx    

        // 117115 cs    
        // 119105 js    
        // 210187 txt    
        //255254 sql    
    }
    public static class FileValidation
    {

        /// <summary>
        /// 是否允许
        /// </summary>
        /// <param name="oFile"></param>
        /// <param name="fileEx"></param>
        /// <returns></returns>
        public static bool IsAllowedExtension(HttpPostedFile oFile, FileExtension[] fileEx)
        {
            int fileLen = oFile.ContentLength;

            byte[] imgArray = new byte[fileLen];
            oFile.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;
        }
        /// <summary>
        /// 上传前的图片是否可靠
        /// </summary>
        /// <param name="oFile"></param>
        /// <returns></returns>
        public static bool IsSecureUploadPhoto(HttpPostedFile oFile)
        {
            bool isPhoto = false;
            string fileExtension = System.IO.Path.GetExtension(oFile.FileName).ToLower();
            string[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg", ".bmp" };
            for (int i = 0; i < allowedExtensions.Length; i++)
            {
                if (fileExtension == allowedExtensions[i])
                {
                    isPhoto = true;
                    break;
                }
            }
            if (!isPhoto) return true;//不是图片,既然允许上传,那就不检测了
            FileExtension[] fe = {FileExtension.BMP,
                                     FileExtension.GIF,
                                     FileExtension.JPG,
                                     FileExtension.PNG
                                 };
            if (IsAllowedExtension(oFile, fe))
                return true;
            else
                return false;
        }
        /// <summary>
        /// 上传后的图片是否安全
        /// </summary>
        /// <param name="photoFile">物理地址</param>
        /// <returns></returns>
        public static bool IsSecureUpfilePhoto(string photoFile)
        {
            bool isPhoto = false;
            string Img = "Yes";
            string fileExtension = System.IO.Path.GetExtension(photoFile).ToLower();
            string[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg", ".bmp" };
            for (int i = 0; i < allowedExtensions.Length; i++)
            {
                if (fileExtension == allowedExtensions[i])
                {
                    isPhoto = true;
                    break;
                }
            }
            if (!isPhoto) return true;//不是图片,既然允许上传,那就不检测了
            StreamReader sr = new StreamReader(photoFile, System.Text.Encoding.Default);
            string strContent = sr.ReadToEnd();
            sr.Close();
            string str = "request|<script|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory|.saveas|wscript.shell|script.encode|server.|.createobject|execute|activexobject|language=";
            foreach (string s in str.Split('|'))
                if (strContent.ToLower().IndexOf(s) != -1)
                {
                    File.Delete(photoFile);
                    Img = "No";
                    break;
                }
            return (Img == "Yes");
        }
    }
种草德鲁伊 2013-01-07
  • 打赏
  • 举报
回复
关键是做到让他们上传了也没办法运行。
丰云 2013-01-07
  • 打赏
  • 举报
回复
引用 7 楼 NqIceCoffee 的回复:
上传过程肯定是不会执行脚本的 楼主以前不是做B/S程序的吧
谢谢,你给的这些,是判断文件类型的方法, 不是我的问题所在啊, 我要的是检测图片流中附加恶意代码的过滤与拦截
conan8126 2013-01-07
  • 打赏
  • 举报
回复
上传文件检测类型到目前为止我只看到过两种,第一种是检测文件的后缀名;第二种是检测文件的头部编码,不同类型文件的头部编码是不一样的(不知道这样说恰当不,有错误希望大家指出),比如255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar...这篇文章代码多有参考网络. 前台文件:两种方法的前台文件是一样的.

<%@ 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.txt改成1.jpg照样可以上传,但其实现方法容易理解,实现也简单,所以网上很多还是采取这种方法.

using System;
using System.Data;
using System.Configuration;
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 _Default : System.Web.UI.Page 
{
   protected void Page_Load(object sender, EventArgs e)
  {

  }
  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>");
   }
   else
   {
   }
  }
}
第二种方法,可以实现真正意义上的文件类型判断,推荐使用这种方法.

using System;
using System.Data;
using System.Configuration;
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 _Default : System.Web.UI.Page 
{
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  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;
  }
}
}
NqIceCoffee 2013-01-07
  • 打赏
  • 举报
回复
上传过程肯定是不会执行脚本的 楼主以前不是做B/S程序的吧
丰云 2013-01-07
  • 打赏
  • 举报
回复
引用 5 楼 NqIceCoffee 的回复:
引用 3 楼 foren_whb 的回复:是的, 网上关于这块的资料很少, 一般都是从图片流中过滤关键字, 问题是我不知道这些关键字是否真的能把木马神马的都过滤掉。。。。 那就把上传的目录的执行权限拿掉,一般情况下是没问题的
上传过程中, 附加的代码也可以直接执行的吧。。。。
NqIceCoffee 2013-01-07
  • 打赏
  • 举报
回复
引用 3 楼 foren_whb 的回复:
是的, 网上关于这块的资料很少, 一般都是从图片流中过滤关键字, 问题是我不知道这些关键字是否真的能把木马神马的都过滤掉。。。。
那就把上传的目录的执行权限拿掉,一般情况下是没问题的
丰云 2013-01-07
  • 打赏
  • 举报
回复
引用 2 楼 NqIceCoffee 的回复:
后缀可以随意改 如果真的要去验证是否是真正的图片,感觉上最终得去验证图片的格式是否合法 这样肯定费劲 以前为了防止这样的事情,我一般不去计较他上传的是什么 不给它上传的目录执行的权限一般情况下就比较安全了 不知道楼主是更关注安全,还是更关注图片的真实性
当然是更关注安全。。。。 图片的合法有效性, 有专门的人去鉴别, 我只管上传。。。。。
丰云 2013-01-07
  • 打赏
  • 举报
回复
引用 1 楼 heycoder 的回复:
是为了防止php asp恶意程序伪装成图片么?
是的, 网上关于这块的资料很少, 一般都是从图片流中过滤关键字, 问题是我不知道这些关键字是否真的能把木马神马的都过滤掉。。。。
NqIceCoffee 2013-01-07
  • 打赏
  • 举报
回复
后缀可以随意改 如果真的要去验证是否是真正的图片,感觉上最终得去验证图片的格式是否合法 这样肯定费劲 以前为了防止这样的事情,我一般不去计较他上传的是什么 不给它上传的目录执行的权限一般情况下就比较安全了 不知道楼主是更关注安全,还是更关注图片的真实性
heycoder 2013-01-07
  • 打赏
  • 举报
回复
是为了防止php asp恶意程序伪装成图片么?

62,263

社区成员

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

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

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

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