如何防范上传的图片包含恶意代码

如题所述

可以防止,第一种就是用文件头的方式验证,代码如下:
private bool IsAllowedExtension(HttpPostedFile hifile)
{
bool result = false;
FileStream strFile = new FileStream(hifile.FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
BinaryReader bReader = new BinaryReader(strFile);
string fileclass = "";
byte buffer;
try
{
buffer = bReader.ReadByte();
fileclass = buffer.ToString();
buffer = bReader.ReadByte();
fileclass += buffer.ToString();
}
catch
{
return false;
}
bReader.Close();
strFile.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
*/
//纯图片
String[] fileType = {
"7173", //gif
"255216", //jpg
"13780" //png
};

for (int i = 0; i < fileType.Length; i++)
{
if (fileclass == fileType[i])
{
result = true;
break;
}
}
Response.Write(fileclass);
return result;
}

protected void btnOk_Click(object sender, EventArgs e)
{
if (IsAllowedExtension(uFile.PostedFile))
{
Response.Write("<script>alert('OK')</script>");
}
}
第二种用文件流的方式验证
/// <summary>
/// 验证流
/// </summary>
/// <param name="UpFile">上传控件(HttpPostedFile 或 HtmlInputFile)</param>
/// <param name="_extensions">扩展名(数组)</param>
/// <param name="SavePath">保存路径(绝对路径)</param>
/// <param name="size">文件大小单位(KB)</param>
/// <param name="err">错误信息</param>
/// <param name="SourcePage">源页面</param>
/// <returns>返回新文件名</returns>
public static string UpLoadFileImg(HtmlInputFile UpFile, string[] _extensions, string SavePath, int size,
out string err, System.Web.UI.Page SourcePage)
{
//锁定页面
SourcePage.Application.Lock();
string error = String.Empty;//错误信息
string Img = UpFile.PostedFile.FileName.Trim();//获取文件名
string Exten = Path.GetExtension(UpFile.PostedFile.FileName).ToLower();//获取文件的扩展名
bool IsExtension = false;//是否存在该扩展名
string FileType = UpFile.PostedFile.ContentType.ToLower();//获取文件的类型

if (Img != "")
{
//判断图片扩展名和类型验证
for (int i = 0; i < _extensions.Length; i++)
{
if (Exten == _extensions[i].ToString())
{
IsExtension = true;
break;
}
}
if (!IsExtension && (FileType != "image/gif" || FileType != "image/x-png" || FileType != "image/pjpeg"
|| FileType != "image/bmp"))
{
error = "对不起,您不能上传该类型的文件!";
err = error;
return Img;
}
if (UpFile.PostedFile.ContentLength > (size * 1024))
{
error = "对不起,文件大小不能大于" + size + "KB!";
err = error;
return Img;
}
try
{
Img = DateTime.Now.Ticks + Exten;//重新给文件命名
//上传文件
UpFile.PostedFile.SaveAs(SavePath + Img);

//最后一步高级验证,图片上传后的操作,判断是否存在危险
StreamReader sr = new StreamReader(SavePath + Img, Encoding.Default);
string strContent = sr.ReadToEnd();
sr.Close();
string str = "request|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory|.saveas";
str+="|wscript.shell|script.encode|server.|.createobject|execute|activexobject|language=";
foreach (string s in str.Split('|'))
{
if (strContent.IndexOf(s) != -1)
{
File.Delete(SavePath + Img);
error = "对不起,该文件内容存在风险,禁止上传!";
err = error;
return Img;
}
}
}
catch
{
error = "系统错误,上传失败!";
}
}
else
error = "对不起,请选择要上传的文件!";

//取消锁定页面
SourcePage.Application.UnLock();
err = error;
return Img;
}
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网