接上篇,Java判断文件类型,继续图片安全问题。若已正确判断出图片类型,防止了绝大多数恶意图片上传。但是若通过修改文件流的方法,给一张本身合法的图片中强行写入一些恶意代码,或者病毒代码,这样前面的方法仍然能够顺利通过,因为它本身是张正确格式的图片,仅仅读取字节与获取图片类型无法做到清除这种类型图片中隐藏的恶意代码。附用UE打开后的恶意图片部分内容,图片的右半部分显示了恶意脚本:

试想,如这种类型图片上传到服务器,当引用了该图片的网页被访问时,而恰好用户的机子装了杀毒软件,则此时杀毒软件会对该页面报警,如果您的网页中存在大量的这种图片,那惨啦,一打开网页,杀毒软件就开始报病毒。这样用户还再敢访问您的网站。

针对这种情况,说白了就是如何清楚合法格式图片中隐藏的恶意信息问题,在工作中无意中发现jmagick可以对图片进行相应处理,而该工具提供的图片缩放方法能将多余的非图片元素清除,那么我们只需要在正确校验格式后对图片按原大小进行一次缩放来清除恶意信息:

代码如下:

package apistudy;

import java.io.IOException;

import magick.ImageInfo;

import magick.MagickImage;

/**

* Created on 2010-7-8

*

Description: [通过jmagick清除图片中的恶意信息]

* @author shixing_11@sina.com

* @version 1.0

*/

public class ImageTypeTest

{

static

{

System.setProperty("jmagick.systemclassloader", "no");

}

/**

* Created on 2010-7-8

*

Discription:[main]

* @param args

* @author:[shixing_11@sina.com]

*/

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

*

Discription:[filterImageByScale,清除图片中的恶意代码]

* @param srcFileName

* @throws IOException

* @author:[shixing_11@sina.com]

*/

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();

}

}

}

}

运行以上程序后,再打开看原来的图片,恶意内容已经没有了,大小也比以前小了,杀毒软件也不会报病毒了。

附:jmagick工具的使用方法:

1. 从http://downloads.jmagick.org/6.3.9/下载windows下使用的jmagick-win-6.3.9-Q16.zip 。

解压后有两个文件jmagick.jar,jmagick.dll.

将jmagick.dll拷贝到系统目录system32下.

将jmagick.jar放在你的工程lib包下,或者环境变量能找着的地方。

2. 安装ImageMagick,官方网站:http://www.imagemagick.org/

3. 安装ImageMagick-6.3.9-0-Q16-windows-dll.exe

总结: 利用jmagick可以对图片做非常强大的处理,人是仅仅如果是校验图片格式以及用来清除图片中的恶意代码,有点杀鸡用牛九的感   觉,为了一个简单的图片校验便得我们的系统不仅要依赖第三方的包(jmagick.jar,jmagick.dll),而且要依赖 第三方的软件jmagick(因为不安装该软件,该方法所依赖的其它一些dll文件无法找到)。这样使得系统与第三方工具的耦合性太强,增加一个故障点。当然如果JDK本身能提供这种图片中恶意代码的清除功能最好不过了,但感觉有点不现实,因为清楚图片里的恶意代码有点类似杀毒软件的功能,纠结~~~,那位大侠有好的建议告诉下小弟,不甚感激。

注意:使用中容易出现的问题

1.若报如下异常

Exception in thread "imgtest" java.lang.UnsatisfiedLinkError: magick.Magick.init()V

at magick.Magick.init(Native Method)

at magick.Magick.(Magick.java:40)

at com.stress.util.MagickImages.main(MagickImages.java:381)

原因:往往是安装ImageMagick-6.3.9-0-Q16-windows-dll.exe时没有全选安装项造成

解决办法:在安装ImageMagick-6.3.9-0-Q16-windows-dll.exe时要全选安装项,截图如下

2.若报如下异常

java.lang.UnsatisfiedLinkError: no JMagick in java.library.path

java.lang.ClassLoader.loadLibrary(ClassLoader.java:1517)

java.lang.Runtime.loadLibrary0(Runtime.java:788)

java.lang.System.loadLibrary(System.java:834)

magick.Magick.(Magick.java:38)

原因:虽然你的jmagick.jar引入了,但是并没有被默认的类加载器加载进来。

解决办法:在类里加上静态块,用系统的类加载器指定下

static

{

System.setProperty("jmagick.systemclassloader", "no");

}

本程序测试环境: WindowsXP + JDK6.0 +Eclipse3.4.1+ImageMagick-6.3.9-0-Q16-windows

如果要在Linux环境下使用,请使用对应的Linux版本(本人未做测试)。

java 用代码清除图片_Java清除图片中的恶意信息(利用jmagick)相关推荐

  1. java主界面设置背景图片_java 窗体设置背景图片问题?(附上登陆界面代码,我想加个背景图片,求大神帮忙改改)...

    java 窗体设置背景图片问题?(附上登陆界面代码,我想加个背景图片,求大神帮忙改改) 关注:223  答案:4  mip版 解决时间 2021-01-26 22:09 提问者非莪莫属 2021-01 ...

  2. java如何添加自定义的图片_java代码将图片加上自定义水印 -4

    java代码将图片加上自定义水印,然后生成了新的图片 import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; ...

  3. java爬取验证码图片_JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取)...

    JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取) 发布时间:2018-05-18 16:41, 浏览次数:632 , 标签: JAVA HttpClien ...

  4. java 菱形代码加解释_Java 9增强的“菱形”语法

    在 Java 7 版本以前,如果使用带泛型的接口.类定义变量,那么调用构造器创建对象时构造器的后面也必须带泛型,这显得有些多余了.例如如下两条语句: List strList = new ArrayL ...

  5. java中如何切割图片_Java 切割图片代码

    Java 切割图片代码 (2012-09-04 10:39:48) 标签: 宽度 切割 源文件 工具类 java package com.lyis.commons.util; import java. ...

  6. java导出pdf 含图片_java 生成PDF含图片和中文件实现代码

    1,所需包 iText.jar iTextAsian.ar(支持中包) 2,列子 package com.pdf; import java.awt.Color; import java.io.File ...

  7. java单击按钮切换图片_JAVA点击按钮改变背景图片 跪求代码·

    展开全部 // 不加包,图片跟类文件在62616964757a686964616fe4b893e5b19e31333262383634一个目录,命令行下编译执行就行了 // 如果建工程,图片放到工程根 ...

  8. java窗体添加背景图片_Java项目实战之实战之天天酷跑(四):游戏主界面

    接上文,本文将实现游戏主界面,功能如下: 移动的背景图片.动态的玩家.玩家的移动功能.五种障碍物持续出现.玩家和障碍物的碰撞.暂停.继续功能. 首先,看一下整体效果: 动图实在太大,几秒钟的 Gif ...

  9. java 字符串转成图片_java 转换图片为字符串,将字符串转换成图片显示

    java 转换图片为字符串,将字符串转换成图片显示, 该方法只适用于比较小的图片传输,50K以内: try{ // 将图片转换成字符串 File imgFile = new File("f: ...

最新文章

  1. php数据采集类,一个数据采集类
  2. Kubernetes — 安装 Dashboard UI
  3. C++ Primer 5th笔记(6)chapter6 函数: 参数
  4. linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的,LINUX内核面试题...
  5. Notepad++ 经常使用快捷键 (MEMO)
  6. 扫描代码重大漏洞 java_超过 75% 的开源软件安全漏洞存在于间接依赖中 | Linux 中国...
  7. SpringBoot中静态资源和首页定制
  8. 程序员要找到自己的兴趣所在
  9. 傲腾内存不支持linux吗,内存英特尔® 傲腾™常见问题
  10. navicat win32注册机下载 | 绿色版
  11. 动态IP和静态IP的区别如何使用动态IP
  12. uni-app入门(一)--介绍
  13. 《苏菲的世界》——读书笔记
  14. 初学者-CSS思维导图(上)
  15. 史上最简单MySQL教程详解(进阶篇)之视图
  16. 计算机网络 第二讲:HTTP
  17. C# 用Microsoft.Office.Interop.PowerPoint类库操作PPT
  18. ImageMagick将多张图片拼接成一张图片_爱剪辑如何把图片制作成视频
  19. 日本味之素EB21二丁基乙基己酰基谷氨酸酰胺型胶凝化剂TDS产品说明书
  20. Mac 下 VirtualBox ubuntu 共享空间

热门文章

  1. Linux服务器 centos系统安装宝塔面板教程
  2. C++——std::async和std::thread
  3. 微信小程序生成小程序码以及参数的获取
  4. 【Sed】使用sed删除文件指定行的内容
  5. 2022年P气瓶充装上岗证题库模拟考试平台操作
  6. 湖首大学计算机硕士学费,2020年湖首大学研究生读几年
  7. Nevercenter CameraBag Pro for mac(照片滤镜工具)
  8. S7-200 SMART 编程技巧及实例分享
  9. mac下载EasyConnect
  10. Python基础语法1(语法和规则)