若已正確判斷出圖片類型,防止了絕大多數惡意圖片上傳。但是若通過修改文件流的方法,給一張本身合法的圖片中強行寫入一些惡意代碼,或者病毒代碼,這樣前面的方法仍然能夠順利通過,因爲它本身是張正確格式的圖片,僅僅讀取字節與獲取圖片類型無法做到清除這種類型圖片中隱藏的惡意代碼。附用UE打開後的惡意圖片部分內容,圖片的右半部分顯示了惡意腳本:
試想,如這種類型圖片上傳到服務器,當引用了該圖片的網頁被訪問時,而恰好用戶的機子裝了殺毒軟件,則此時殺毒軟件會對該頁面報警,如果您的網頁中存在大量的這種圖片,那慘啦,一打開網頁,殺毒軟件就開始報病毒。這樣用戶還再敢訪問您的網站。
針對這種情況,對於圖片類型的文件,可以在上傳後,對圖片進行相應的縮放,破壞惡意用戶上傳的二進制可執行文件的結構,來避免惡意代碼執行。jmagick可以對圖片進行相應處理,而該工具提供的圖片縮放方法能將多餘的非圖片元素清除,那麼我們只需要在正確校驗格式後對圖片按原大小進行一次縮放來清除惡意信息:
代碼如下:
packageapistudy;
importjava.io.IOException;
importmagick.ImageInfo;
importmagick.MagickImage;
/**
*Createdon2010-7-8
*<p>Description:[通過jmagick清除圖片中的惡意信息]</p>
*@author[emailprotected]
*@version1.0
*/
publicclassImageTypeTest
{
static
{
System.setProperty("jmagick.systemclassloader","no");
}
/**
*Createdon2010-7-8
*<p>Discription:[main]</p>
*@paramargs
*@author:[[emailprotected]]
*/
publicstaticvoidmain(String[]args)
{
StringsrcFileName="c:/img/c.jpg";
try
{
filterImageByScale(srcFileName);
}
catch(IOExceptione)
{
e.printStackTrace();
}
}
/**
*Createdon2010-7-8
*<p>Discription:[filterImageByScale,清除圖片中的惡意代碼]</p>
*@paramsrcFileName
*@throwsIOException
*@author:[[emailprotected]]
*/
publicfinalstaticvoidfilterImageByScale(StringsrcFileName)throwsIOException
{
MagickImagemagic=null;
try
{
ImageInfoimgInfo=newImageInfo(srcFileName);
magic=newMagickImage(imgInfo);
intwidth=(int)magic.getDimension().getWidth();
intheight=(int)magic.getDimension().getHeight();
MagickImagenewImage=magic.scaleImage(width,height);
newImage.profileImage("*",null);//清除無用信息
newImage.setImageAttribute("JPEG-Sampling-factors",null);//清除無用信息
newImage.setImageAttribute("comment",null);//清除無用信息
newImage.writeImage(newImageInfo());
newImage.writeImage(imgInfo);
}
catch(Exceptione1)
{
e1.printStackTrace();
}
finally
{
try
{
magic.destroyImages();
}
catch(Exceptione2)
{
e2.printStackTrace();
}
}
}
}
運行以上程序後,再打開看原來的圖片,惡意內容已經沒有了,大小也比以前小了,殺毒軟件也不會報病毒了。