接上篇http://www.linuxidc.com/Linux/2011-11/46610.htm,Java判斷文件類型,繼續圖片安全問題。若已正確判斷出圖片類型,防止了絕大多數惡意圖片上傳。但是若通過修改文件流的方法,給一張本身合法的圖片中強行寫入一些惡意代碼,或者病毒代碼,這樣前面的方法仍然能夠順利通過,因為它本身是張正確格式的圖片,僅僅讀取字節與獲取圖片類型無法做到清除這種類型圖片中隱藏的惡意代碼。附用UE打開後的惡意圖片部分內容,圖片的右半部分顯示了惡意腳本:
試想,如這種類型圖片上傳到服務器,當引用了該圖片的網頁被訪問時,而恰好用戶的機子裝了殺毒軟件,則此時殺毒軟件會對該頁面報警,如果您的網頁中存在大量的這種圖片,那慘啦,一打開網頁,殺毒軟件就開始報病毒。這樣用戶還再敢訪問您的網站。
針對這種情況,說白了就是如何清楚合法格式圖片中隱藏的惡意信息問題,在工作中無意中發現jmagick可以對圖片進行相應處理,而該工具提供的圖片縮放方法能將多余的非圖片元素清除,那麼我們只需要在正確校驗格式後對圖片按原大小進行一次縮放來清除惡意信息:
代碼如下:
- package apistudy;
- import java.io.IOException;
- import magick.ImageInfo;
- import magick.MagickImage;
- /**
- * Created on 2010-7-8
- * <p>Description: [通過jmagick清除圖片中的惡意信息]</p>
- * @author [email protected]
- * @version 1.0
- */
- public class ImageTypeTest
- {
- static
- {
- System.setProperty("jmagick.systemclassloader", "no");
- }
- /**
- * Created on 2010-7-8
- * <p>Discription:[main]</p>
- * @param args
- * @author:[[email protected]]
- */
- public static void main(String[] args)
- {
- String srcFileName = "c:/img/c.jpg";
- try
- {
- filterImageByScale(srcFileName);
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- /**
- * Created on 2010-7-8
- * <p>Discription:[filterImageByScale,清除圖片中的惡意代碼]</p>
- * @param srcFileName
- * @throws IOException
- * @author:[[email protected]]
- */
- public final static void filterImageByScale(String srcFileName) throws IOException
- {
- MagickImage magic = null;
- try
- {
- ImageInfo imgInfo = new ImageInfo(srcFileName);
- magic = new MagickImage(imgInfo);
- int width = (int) magic.getDimension().getWidth();
- int height = (int) magic.getDimension().getHeight();
- MagickImage newImage = magic.scaleImage(width, height);
- newImage.profileImage("*", null); //清除無用信息
- newImage.setImageAttribute("JPEG-Sampling-factors", null); //清除無用信息
- newImage.setImageAttribute("comment", null); //清除無用信息
- newImage.writeImage(new ImageInfo());
- newImage.writeImage(imgInfo);
- }
- catch (Exception e1)
- {
- e1.printStackTrace();
- }
- finally
- {
- try
- {
- magic.destroyImages();
- }
- catch (Exception e2)
- {
- e2.printStackTrace();
- }
- }
- }
- }
運行以上程序後,再打開看原來的圖片,惡意內容已經沒有了,大小也比以前小了,殺毒軟件也不會報病毒了。