为了防止一些用户将一些病毒文件上传到服务器,我们一般需要对上传的文件做合法性校验, 当时有时候简单的后缀和contentType校验任然还有风险,下面我们一起来讨论一下上传的文件需要做哪些合法性校验。
1、文件后缀校验
这层校验应该说是最基本的校验了,我们不能允许用户上传一些exe、jsp、php、asp、html等可执行的文件。
2、contentType校验
contentType是内容类型,它会告诉浏览器用什么形式、什么编码来读取这个文件。因此文件后缀和contentType有一个对应关系,上传文件的后缀和contentType应该是对应的,如果不对应则上传信息已被篡改。后缀和contentType关系表参考tomcat下conf/web.xml中。
3、上传图片校验
如果需要上传的文件是图片,必须对上传的文件是否是一个图片进行检验,否则如果用户将一个html文件修改后缀为图片并上传,在显示该图片时就会执行html文件中的内容,带来跨域攻击风险。
图片校验方式
(1)、通过ImageIO读取文件,如果抛出异常或者读取后的对象为null,表示该文件不是图片
/** * 通过读取文件信息判断文件是否是图片 * @param imageFile * @return */ public static boolean checkImageFileByRead(File imageFile){ try { BufferedImage image = ImageIO.read(imageFile); if(image == null){ log.error("The file could not be opened , it is not an image"); return false; } } catch (IOException e) { log.error(e.getMessage(), e); return false; } return true; }
(2)、通过ImageIO读取文件成图片流,如果抛出异常或者读取后的流对象为null,表示文件不是图片
/** * 通过将文件转换为图片流方式监测文件是否为图片 * @param imageFile * @return */ public static boolean checkImageFileByIS(File imageFile){ try { ImageInputStream is = ImageIO.createImageInputStream(imageFile); if(is == null){ return false; } is.close(); } catch (IOException e) { log.error(e.getMessage(), e); return false; } return true; }
(3)有些图片中可能会嵌入IFrame,以同样会导致跨域攻击,可以采用添加水印方式解决
/** * 给图片添加水印、可设置水印图片旋转角度 * * @param iconPath * 水印图片路径 * @param srcImgPath * 源图片路径 * @param targerPath * 目标图片路径 * @param degree * 水印图片旋转角度 * @param width * 宽度(与左相比) * @param height * 高度(与顶相比) * @param clarity * 透明度(小于1的数)越接近0越透明 */ public static void waterMarkImageByIcon(String iconPath, String srcImgPath, String targerPath, Integer degree, Integer width, Integer height, float clarity) { OutputStream os = null; try { Image srcImg = ImageIO.read(new File(srcImgPath)); System.out.println("width:" + srcImg.getWidth(null)); System.out.println("height:" + srcImg.getHeight(null)); BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); // 得到画笔对象 // Graphics g= buffImg.getGraphics(); Graphics2D g = buffImg.createGraphics(); // 设置对线段的锯齿状边缘处理 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage( srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); if (null != degree) { // 设置水印旋转 g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2); } // 水印图象的路径 水印一般为gif或者png的,这样可设置透明度 ImageIcon imgIcon = new ImageIcon(iconPath); // 得到Image对象。 Image img = imgIcon.getImage(); float alpha = clarity; // 透明度 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 表示水印图片的位置 g.drawImage(img, width, height, null); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); g.dispose(); os = new FileOutputStream(targerPath); // 生成图片 ImageIO.write(buffImg, "JPG", os); System.out.println("添加水印图片完成!"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != os) os.close(); } catch (Exception e) { e.printStackTrace(); } } } /** * 给图片添加水印、可设置水印图片旋转角度 * * @param logoText * 水印文字 * @param srcImgPath * 源图片路径 * @param targerPath * 目标图片路径 * @param degree * 水印图片旋转角度 * @param width * 宽度(与左相比) * @param height * 高度(与顶相比) * @param clarity * 透明度(小于1的数)越接近0越透明 */ public static void waterMarkByText(String logoText, String srcImgPath, String targerPath, Integer degree, Integer width, Integer height, Float clarity) { // 主图片的路径 InputStream is = null; OutputStream os = null; try { Image srcImg = ImageIO.read(new File(srcImgPath)); BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); // 得到画笔对象 // Graphics g= buffImg.getGraphics(); Graphics2D g = buffImg.createGraphics(); // 设置对线段的锯齿状边缘处理 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage( srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); if (null != degree) { // 设置水印旋转 g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2); } // 设置颜色 g.setColor(Color.red); // 设置 Font g.setFont(new Font("宋体", Font.BOLD, 30)); float alpha = clarity; g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) . g.drawString(logoText, width, height); g.dispose(); os = new FileOutputStream(targerPath); // 生成图片 ImageIO.write(buffImg, "JPG", os); System.out.println("添加水印文字完成!"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != is) is.close(); } catch (Exception e) { e.printStackTrace(); } try { if (null != os) os.close(); } catch (Exception e) { e.printStackTrace(); } } }
做到这几步,一般的安全问题就解决了,如果大家有更好的解决方案,欢迎一起讨论。
相关推荐
js 上传图片 校验 文件类型 大小js 上传图片 校验 文件类型 大小js 上传图片 校验 文件类型 大小 js 上传文件校验 js 上传文件校验 js 上传文件校验
主要介绍了java实现上传文件类型检测过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Struts2+hibernate+spring实现多文件的上传与下载功能,主要包括:上传、下载、删除 1.能够对多个文件进行上传(可以选择上传文件个数,也即...文件上传是运用了Ajax技术对上传文件校验,判断数据库中是否存在该文件
代码演示了几种获取MimeType类型的方法,包括jar包
(2)对上传文件后缀与MIME Type进行匹配校验, 对文件头信息与文件后缀进行匹配校验。 (3)对单个文件大小和总文件数进行限制, 避免拒绝服务攻击。 (4)对文件名进行输入校验,显示时进行输出编码。 3. 文件存储...
一个极度纯净的上传插件,支持多文件上传、上传速率动态控制、真实进度监控kb/s、分块生成MD5、分块上传、MD5校验秒传、暂停、取消等。.zip,anyupload是一个极度纯净的上传插件,通过简单调整就可以融入到任何项目,...
ExtJS验证文件上传类型,详细讲述ExtJS如何验证文件上传文件的类型!
java socket在传输文件时,分包、组包和校验。 校验包数据,现成的代码可以拷贝直接运行。
网络C/S文件传输工具,支持`UDP/TCP`,断点续传,局域网探测,上传下载,文件校验: 上传命令: $ file put //参数支持用-分割,也可直接输入 $ file -put //第三参数为空时,默认TCP上传方式 $ file put -tcp //...
POI导入Excel并返回校验后的错误文件(原样数据文件,并添加批注,注:由于批注只能加1000条,会在Excel后面添加一栏错误信息)下载以及页面展示校验错误信息,同时添加导入进度条,提供页面js和css代码,后端...
* * * * * * * * * * * * 目录页 文件上传漏洞利用 MIME校验 文件上传漏洞---绕过MIME检测 1)上传一句话木马 eval.php 2)上传地址 36/DVWA/vulnerabilities/upload2 文件上传漏洞利用 文件上传漏洞---绕过MIME检测...
这个类可以实现,java语言下通过对上传文件进行MD5加密,然后将加密值与原来上传的文件加密值进行对比,防止上传重复文件。
asp.net使用upload控件上传图片,并可以检测文件的真正格式
支持定时传输,文件分割合并,断点续传,aes加密解密,md5文件校验完整性。客户端实现文件分割,加密,服务端实现文件解密,合并。异地项目访问采用的是http协议,客户端根据http协议访问服务端对应的方法,返回一个...
自己重新封装的C# FTP实现上传,下载,创建文件,文件夹,删除单个文件 MD5校验等, 支持FTP非空目录递归删除操作,测试通过,好用 环境为VS2012 开发
描述文档请看我的个人博客:www.mesoftware.cn
主要介绍了Java防止文件被篡改之文件校验功能,本文给大家分享了文件校验和原理及具体实现思路,需要的朋友可以参考下
该系统完美集成了fastDFS文件服务客户端,支持断点续传、分块上传、文件秒传等功能,提供了稳定的前后端组件(前端H5),并支持多用户并发上传文件校验(文件锁)。该组件可以快速集成fastDFS文件服务,免去繁琐的...
说明支持浏览器端excel\csv文件的校验并上传属性属性说明类型sheetProps校验属性和规则等信息(必选)objecthandleMoreValidate?额外自定义校验(可选)functiondragProps?antd组件属性的透传,可缺省(可选)...
java验证文件真实格式和编码格式工具类,验证文件的文件格式和文件的编码格式给出正确的文件类型以及编码格式,从此解决文件解析乱码问题的烦恼