本文出自冯立彬的博客
,原地址: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代码:
-
-
-
-
-
-
-
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实现:
-
-
-
-
-
-
-
-
-
-
-
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);
-
}
通过以上几种方式,应该可以避免绝大部份图片中带恶意代码的安全问题,不过由于我个人的才疏学浅,可能有没有考虑周全的地方,还请各位不吝指教了。
分享到:
相关推荐
然后,可以调用Java的图片处理函数,对保存的图片进行操作。最后,返回处理后的图片路径或者直接显示在页面上。 在实际应用中,我们还需要考虑性能优化,比如使用内存缓存减少磁盘I/O,或者使用多线程处理大量图片...
考虑到大尺寸图片的处理效率,可以使用分块哈希(Block Hashing)或部分哈希(Partial Hashing)等技术,只对图片的部分区域或特定特征进行哈希计算,同时保持足够的敏感度以检测篡改。 7. **鲁棒性与安全性**: ...
Java实现图片上传涉及的关键技术有:文件操作(File类)、HTTP请求(Multipart编码)、服务器端文件处理(如Apache Commons FileUpload)、存储策略(文件系统或云存储)以及安全性与性能优化(如文件大小检查、类型...
- 对于用户上传的图片,应进行安全检查,防止恶意代码注入,例如检查文件类型、大小,以及使用安全的图片库进行处理。 - 保护图片版权,可以添加水印或元数据信息。 这个项目的核心是通过Java实现图片的压缩和...
在Java编程中,图片处理是一项常见的任务,包括图片的上传、尺寸控制、宽高调整以及裁剪和保存等操作。这些功能在Web应用、图像处理软件或者数据分析项目中都有广泛的应用。下面我们将深入探讨如何使用Java实现这些...
以上就是关于"java上传图片配置"的主要知识点,涵盖了从后端接收图片、处理图片到存储图片的全过程,以及涉及到的JavaMagick和ImageMagick工具的使用。在实际开发中,根据项目需求和团队技术栈,可以选择不同的实现...
3. **文件验证**:在接收图片时,需要进行验证,确保上传的文件确实是图片格式,比如JPEG、PNG、GIF等,并且检查文件大小,防止过大文件导致服务器资源耗尽。 4. **进度条显示**:为了提供良好的用户体验,批量上传...
在实际项目中,还需要考虑错误处理、文件大小限制、文件类型检查等安全性问题,以及优化用户体验,如进度条显示、异步上传等。此外,为了防止跨站脚本攻击(XSS)和跨站请求伪造(CSRF),应使用安全的编码实践和...
总的来说,“Java批量图片上传”是一个涉及前端交互、后端处理、数据库操作以及安全策略等多个技术层面的问题。通过合理的架构设计和优化,我们可以构建一个高效、稳定且安全的图片批量上传系统。在Oracle数据库环境...
上传的图片可能携带恶意代码,因此应进行安全检查,如限制上传文件类型,使用Content-Disposition防止文件注入攻击。数据库连接字符串和敏感信息应妥善保管,避免泄露。 最后,**用户体验**是重要的考虑因素。在...
总结起来,Java图片异步上传涉及前端的异步请求、后端的接收处理、多线程、文件存储、状态通知、错误处理以及安全性等多个方面,需要综合运用多种技术和策略来实现一个完整的、高性能的图片上传功能。在实际开发中,...
为了防止恶意文件上传,需要对上传的文件进行安全检查,例如验证文件类型、大小,甚至可以使用MD5或SHA校验码检查文件完整性。 8. **富文本编辑器集成**: 描述中提到图片上传与富文本编辑器有关,像CKEditor、...
3. **文件命名与重命名**: 为了避免文件名冲突和安全问题,通常会对上传的图片进行重命名,如使用时间戳、UUID等生成唯一的文件名。 4. **文件格式检查**: 在保存之前,要验证文件是否为图片格式,如JPEG、PNG、GIF...
在Java开发中,图片上传是一项常见的...以上就是关于"java图片上传"的相关知识点,涵盖了图片处理、流控制、云存储服务以及相关的安全和性能优化策略。理解并掌握这些知识点,能够帮助开发者高效地实现图片上传功能。
在Java Web开发中,处理图片的上传和下载是常见的需求,尤其...以上就是使用Java JSP处理图片上传下载的基本流程和关键知识点,希望对你的学习有所帮助。在实际操作中,不断实践和调试,你会对这些概念有更深入的理解。
在Java和JSP开发中,有时我们需要处理在线编辑器上传的内容,这可能涉及到从Web页面中获取远程图片并将其保存到本地服务器。这样的功能对于确保网站的性能和用户体验至关重要,因为将图片本地化可以减少加载时间,...
5. **数据序列化与反序列化**:在Java中,如果版本号是自定义对象,可能需要使用序列化和反序列化技术进行传输。`Serializable`接口标记对象可以被序列化,而`ObjectOutputStream`和`ObjectInputStream`用于对象的...
以上就是使用Java处理图片存取数据库的基本流程,实际应用中可能需要根据具体需求进行调整和优化。在开发过程中,确保遵循最佳实践,包括数据安全、性能优化和异常处理,以保证系统的稳定性和可靠性。
【标题】"Java版扫雷源代码+图片素材"揭示了使用Java编程语言实现的经典扫雷游戏的开发过程。在编程领域,扫雷游戏通常被用作教学示例,因为它涉及到了基本的逻辑处理、图形用户界面(GUI)设计以及算法的应用。 ...
通过上述方式,我们可以构建一个高效、安全的Java图片上传系统,结合JavaScript前端交互,为用户提供便捷的图片上传体验。在实际项目中,还需考虑负载均衡、分布式存储等高级话题,以适应大规模的用户访问和数据处理...