使用JAVA如何对图片进行格式检查以及安全检查处理
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
本文出自冯立彬的博客,原地址:http://www.fenglibin.com/use_java_to_check_images_type_and_security.html
一、通常情况下,验证一个文件是否图片,可以通过以下三种方式:
1)、判断文件的扩展名是否是要求的图片扩展名
这种判断是用得比较多的一种方式,不过这种方式非常的不妥,别人稍微的把一个不是图片的文件的扩展名修改为图片的扩展名,就绕开了你的这种校验,如果这上传的文件是shell、php或者jsp,那你的网站基本上可以说就在别人的手里面了。
不过这种判断方式也不是完全没有用,我们可以把它放在判断图片的最外层,如果一个文件连扩展名都不是我们所要求的图片扩展名,那就根本不用后面的内容格式检查了,从一定程度上说,对减少服务器的压力还是有一定的帮助,否则所有的文件都等上传完后成后再通过服务器去判断,那会在一定程度上浪费器资源的。
2)、根据文件的前面几个字节,即常说的魔术数字进行判断,不同文件类型的开头几个字节,可以查看我的另外一篇专站介绍:表示不同文件类型的魔术数字。
但是这种判断方式也是非常不靠谱的,因为他只能够验证文件的前面几个字节,如此时有人把一个可执行的PHP文件的扩展名修改为PNG,然后再在前面补上”89 50″两个字节,就又绕开了这种验证方式。
以下是一段通过JAVA代码获取文件前面两个字节的示例程序:
import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream; public class ImageTypeCheck{ public static String bytesToHexString(byte[] src){ StringBuilder stringBuilder = new StringBuilder(); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } public static void main(String[] args) throws IOException{ String imagePath = "c:/favicon.png"; File image = new File(imagePath); InputStream is = new FileInputStream(image); byte[] bt = new byte[2]; is.read(bt); System.out.println(bytesToHexString(bt)); }}
不过这种判断方式和判断扩展名一样,也不是完全没有用,至少可以在前期在简单的检查,为进入下一步检查做铺垫。
3)、获取图片的宽高属性
如果能够正常的获取到一张图片的宽高属性,那肯定这是一张图片,因为非图片文件我们是获取不到它的宽高属性的,以下是用于获取根据是否可以获取到图片宽高属性来判断这是否一张图片的JAVA代码:
/** * 通过读取文件并获取其width及height的方式,来判断判断当前文件是否图片,这是一种非常简单的方式。 * * @param imageFile * @return */ public static boolean isImage(File imageFile){ if (!imageFile.exists()) { return false; } Image img = null; try { img = ImageIO.read(imageFile); if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) { return false; } return true; } catch (Exception e) { return false; } finally { img = null; } }
二、图片文件的安全检查处理
好了,我们终于判断出一个文件是否图片了,可是如果是在一个可以正常浏览的图片文件中加入一些非法的代码呢:
这就是在一张正常的图片末尾增加的一些iframe代码,我曾经尝试过单独打开这张图片,也将这张图片放于网页上打开,虽然这样都不会被执行,但并不代表插入其它的代码也并不会执行,杀毒软件(如AVAST)对这种修改是会报为病毒的。
那我们要如何预防这种东西,即可以正常打开,又具有正确的图片文件扩展名,还可以获取到它的宽高属性?呵,我们这个时候可以对这个图片进地重写,给它增加水印或者对它进行resize操作,这样新生成的图片就不会再包含这样的恶意代码了,以下是一个增加水印的JAVA实现:
/** * 添加图片水印 * * @param srcImg 目标图片路径,如:C:\\kutuku.jpg * @param waterImg 水印图片路径,如:C:\\kutuku.png * @param x 水印图片距离目标图片左侧的偏移量,如果x<0, 则在正中间 * @param y 水印图片距离目标图片上侧的偏移量,如果y<0, 则在正中间 * @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明) * @throws IOException */ public final static void addWaterMark(String srcImg, String waterImg, int x, int y, float alpha) throws IOException{ // 加载目标图片 File file = new File(srcImg); String ext = srcImg.substring(srcImg.lastIndexOf(".") + 1); Image image = ImageIO.read(file); int width = image.getWidth(null); int height = image.getHeight(null); // 将目标图片加载到内存。 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = bufferedImage.createGraphics(); g.drawImage(image, 0, 0, width, height, null); // 加载水印图片。 Image waterImage = ImageIO.read(new File(waterImg)); int width_1 = waterImage.getWidth(null); int height_1 = waterImage.getHeight(null); // 设置水印图片的透明度。 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 设置水印图片的位置。 int widthDiff = width - width_1; int heightDiff = height - height_1; if (x < 0) { x = widthDiff / 2; } else if (x > widthDiff) { x = widthDiff; } if (y < 0) { y = heightDiff / 2; } else if (y > heightDiff) { y = heightDiff; } // 将水印图片“画”在原有的图片的制定位置。 g.drawImage(waterImage, x, y, width_1, height_1, null); // 关闭画笔。 g.dispose(); // 保存目标图片。 ImageIO.write(bufferedImage, ext, file); }
通过以上几种方式,应该可以避免绝大部份图片中带恶意代码的安全问题,不过由于我个人的才疏学浅,可能有没有考虑周全的地方,还请各位不吝指教了。
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
![](/assets/blank.gif)
使用JAVA如何对图片进行格式检查以及安全检查处理相关推荐
- java 图片检查_使用JAVA如何对图片进行格式检查以及安全检查处理
一.通常情况下,验证一个文件是否图片,可以通过以下三种方式: 1).判断文件的扩展名是否是要求的图片扩展名 这种判断是用得比较多的一种方式,不过这种方式非常的不妥,别人稍微的把一个不是图片的文件的扩展 ...
- java 时间格式检查
检查日期需求: 日期格式如:20120101或者2012-01-01 直接用SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDD&quo ...
- Java实现视频格式转化
转载:https://blog.csdn.net/l1028386804/article/details/44889781 核心是利用ffmpeg进行视频转换,我们自己并不写转换视频的代码,只是调用f ...
- documents4j:Java文档格式转换开发库
为什么80%的码农都做不了架构师?>>> http://hao.jobbole.com/documents4j/ documents4j:Java文档格式转换开发库 docum ...
- java 导出csv 格式,java导出csv格式文件的方法
这篇文章主要为大家详细介绍了java导出csv格式文件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 导出csv格式文件的本质是导出以逗号为分隔的文本数据 imp ...
- java是什么格式_是java格式
错误:编码GBK的不可映射字符的解决办法 最近在重新补javaSE的基础,编辑器编写完代码以后,在控制台运行代码段的时候,出现了以下的错误提示:错误:编码GBK的不可映射字符 在通过查询谷哥和度娘以后 ...
- python论文格式检查系统_论文格式检查软件
论文格式检查软件 [篇一:毕业论文格式检查使用说明书] " 毕业论文格式检查 v1.0" 使用说明书 " 毕业论文格式检查 v1.0" 是专门用来对毕业设计(论 ...
- 读取/书写Java的XML格式properties文件
转载自 读取/书写Java的XML格式properties文件 在JDK5中,properties文件的格式可以由XML构成,这里给出了一个读取/书写XML格式properties文件的例子. 因为 ...
- Java 中的双重检查(Double-Check)
转载自 Java 中的双重检查(Double-Check) 在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用.该模式的结构如下 ...
最新文章
- Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展
- Bootstrap之Carousel不能自动播放的解决办法(转)
- Luogu P3321 [SDOI2015]序列统计
- Vue:解决实现留言回复功能时,点击回复某一条所有回复面板都弹出
- 什么是推荐系统?推荐系统类型、用例和应用
- 教你如何写Bug:Google Guava源码分析之——Joiner
- linux u盘保护,如何解除U盘写保护状态?
- 下载Youtube-8m视频,ubuntu安装测试使用
- PDF是如何在线分割的?
- 自然生长不含咖啡碱的茶树新品种--T三有机可可茶
- java获取GET和POST请求参数
- 微信小程序,几行代码实现图片瀑布流
- 为什么要使用Retrofit,Retrofit与OkHttp
- 宇视设备搜索工具_【聚焦】2019版中国纸箱行业供应商搜索引擎、全球瓦楞行业设备前沿技术报告将于4月瓦楞展现场首发!...
- fMRI提取ROI时间序列
- echarts世界地图更新,添加十段线
- 如何通过刷百度指数来提高网站的权重
- R语言数字转字符串:自动补0
- 【硅谷问道】 WWDC 17: 开发者的最初观感
- 一、Kubernetes (k8s) 是什么, 有什么用?
热门文章
- 【华为云技术分享】云图说|管理与部署域家族云图说重磅推出:一图在手,谁与争锋!
- 高能街访 | 为什么他们都纷纷为深圳打Call?
- linux配置apache服务器项目文档,Apache(Linux)服务器配置文档.doc
- getReadableDatabase VS getWritableDatabase
- 450g带盖吐司配方_食谱 | 直接法北海道吐司,一起get柔软的秘密!
- 如何卸载bytefence anti-malware
- WORD单元格底部内容不见了怎么办?
- java.lang.applet_Java Applet RuntimeException:java.lang.NoClassDefFoun...
- CSS样式引入方式和部分CSS样式的设置
- android开发,加法,上课写的demo