shiro安全框架扩展教程--上传文件的安全控制

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

           相信每一个项目都会存在文件上传功能,最常见的就是图片,音频,视频等上传,但是如果用户多的应用都会存在用户恶意上传动作,包括伪装成可上传文件,

按照我们以往的方式,普通地判断后缀名,那是不可行,除了一些内部系统可以这样简单的玩耍,那对外的互联网应用项目是不够严格的


下面举例个简单的攻击


1. 我们的上传代码中只判断了,request里面的文件类型

2. 恶意用户把一个jsp文件,修改了头文件信息,这样就可以骗过浏览器上传过程中是显示文件是image/jpeg

3. 然后文件就可以直接保存成功了,很明显这是由于服务端判断不严谨导致的,用户访问xxxx路径下的上传jsp文件然后就可以执行jsp里面的脚本,你的资料基本就泄漏的差不多了


然后下面如果说是加个后缀名判断,也差不多可以这样绕过


我们都知道文件都有所谓的文件头信息,但是除了jsp,txt等一些特殊的是没有固定的,所以我们要排除这些


下面看看一些常用的文件头信息匹配


                fileHeaderType.put(".jpg", "FFD8FF"); // JPEG (jpg)
		fileHeaderType.put(".png", "89504E47"); // PNG (png)
		fileHeaderType.put(".gif", "47494638"); // GIF (gif)
		fileHeaderType.put(".tif", "49492A00"); // TIFF (tif)
		fileHeaderType.put(".bmp", "424D"); // Windows Bitmap (bmp)
		
		fileHeaderType.put(".zip", "504B0304");
		fileHeaderType.put(".rar", "52617221");
		fileHeaderType.put(".7z", "377abcaf");
		
		fileHeaderType.put(".xls", "D0CF11E0");
		fileHeaderType.put(".xlsx", "504b030414");
		fileHeaderType.put(".doc", "D0CF11E0"); 
		fileHeaderType.put(".docx", "504b0304"); 
		
		fileHeaderType.put(".dwg", "41433130"); // CAD (dwg)
		fileHeaderType.put(".html", "68746D6C3E"); // HTML (html)
		fileHeaderType.put(".rtf", "7B5C727466"); // Rich Text Format (rtf)
		fileHeaderType.put(".xml", "3C3F786D6C");
		
		fileHeaderType.put(".psd", "38425053"); // Photoshop (psd)
		fileHeaderType.put(".eml", "44656C69766572792D646174653A"); // Email

		fileHeaderType.put(".dbx", "CFAD12FEC5FD746F"); // Outlook Express (dbx)
		fileHeaderType.put(".pst", "2142444E"); // Outlook (pst)
		
		fileHeaderType.put(".mdb", "5374616E64617264204A"); // MS Access (mdb)
		fileHeaderType.put(".wpd", "FF575043"); // WordPerfect (wpd)
		fileHeaderType.put(".eps", "252150532D41646F6265");
		fileHeaderType.put(".ps", "252150532D41646F6265");
		fileHeaderType.put(".pdf", "255044462D312E"); // Adobe Acrobat (pdf)
		fileHeaderType.put(".qdf", "AC9EBD8F"); // Quicken (qdf)
		fileHeaderType.put(".pwl", "E3828596"); // Windows Password (pwl)
		fileHeaderType.put(".wav", "57415645"); // Wave (wav)
		fileHeaderType.put(".avi", "41564920");
		fileHeaderType.put(".ram", "2E7261FD"); // Real Audio (ram)
		fileHeaderType.put(".rm", "2E524D46"); // Real Media (rm)
		fileHeaderType.put(".mpg", "000001BA"); //    
		fileHeaderType.put(".mov", "6D6F6F76"); // Quicktime (mov)
		fileHeaderType.put(".asf", "3026B2758E66CF11"); // Windows Media (asf)
		fileHeaderType.put(".mid", "4D546864"); // MIDI (mid)

如何使用呢?我们应该读取文件的前面一些字节,然后匹配这些固定的字符串,如果可以匹配上那证明是合法的


/** 获取文件头 */
	private static String getFileHeader(File file, int byteSize) throws IOException {

		InputStream in = new FileInputStream(file);

		byte[] b = new byte[byteSize];
		in.read(b, 0, b.length);

		if (b == null || b.length <= 0) {
			return null;
		}

		StringBuffer buffer = new StringBuffer();

		for (int i = 0, len = b.length; i < len; i++) {
			int v = b[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				buffer.append(0);
			}
			buffer.append(hv);
		}
		return buffer.toString().toLowerCase();
	}


然后使用对应的类型和对应的文件头信息匹配,但是有个比较麻烦的问题,如果图片把jpg后缀改成png,应该算是正常合法的,所以这个时候应该把当前后缀全部匹配下图片的魔数

如果找到一个合法则认为通过,这样处理应该是比较正确的


文件上传java例子(webuploader包括前台和后台代码) 用百度的js webuploader 做的大文件上传的例子, 多线程上传,包括前台和后台代码 立即下载

相关推荐

shiro 配置文件

从web.xml到spring 配置shiro的使用

SpringBoot集成shrio实现文件上传下载

SpringBoot集成Shrio时遇到上传下载文件报错问题

Haode258的博客 379

flashupload 实现文件的批量上传

1)通过flash实现批量上传 2)界面美观 3)修改简单

shiro拦截导致跨域,文件上传不成功

先上解决办法 package com.mengruan.webbackage.config; import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; import org.springframework.context.annotation.Configuration; import javax.servlet.Se...

qq_27275851的博客 1182

推荐:ShiroUploadTools - 简单高效的文件上传工具

推荐:ShiroUploadTools - 简单高效的文件上传工具 在数字时代,文件上传功能是许多Web应用的基础部分。如果你正在寻找一个简单易用、高性能的Java文件上传解决方案,那么是一个值得考虑的项目。 项目简介 ShiroUploadTools是由开发者LTianHang创建的一个基于Apache Shiro文件上传工具库。它旨在简化Java Web应用程序中的文件上传流程,提供了一套完...

gitblog_00040的博客 487

解决Shiro文件上传的获取不到文件问题

这里写自定义目录标题 解决Shiro文件上传的获取不到文件问题 Spring提供了两个MultipartResolver的实现用于处理multipart请求: CommonsMultipartResolver StandardServletMultipartResolver 其中CommonsMultipartResolver使用的是commons Fileupload来处理multipart请求,这是最常用的,所以在使用时,必须要引入相应的jar包. 而StandardServletMultipartRe

maoyufan1991的博客 973

SSM框架系列之框架整合教程

SSM框架系列之框架整合教程 发布于2022-05-07 15:54:58阅读 3650 很久之前就想写的教程,因为忙着找实习的原因,没有整理出来,首先SSM框架组合(SpringMVC+Spring+Mybatis)和SSH(Spring4.0+Struts2+Hibernate4.0)组合是外面企业里很常用的两种MVC架构,本博客介绍SSM框架组合,这种MVC架构的搭建过程jar准备的话,可以用maven或者网上下载 SpringMVC需要的jarjar作用详解(网上收集): aopaliance.ja

weixin_44314618的博客 317

SpringBoot+Shiro权限配置实战:避免/profile路径的拦截陷阱

Java企业级应用开发中,权限控制是保障系统安全的核心机制。Apache Shiro作为一款强大且易用的安全框架,通过与SpringBoot集成,为开发者提供了身份认证、授权、会话管理等一站式解决方案。其核心原理在于过滤器链(Filter Chain),它像一道安检门,对每个HTTP请求进行拦截与校验,确保只有具备相应权限的用户才能访问特定资源。这项技术的价值在于,它能从架构层面统一管理访问控制逻辑,大幅降低业务代码的安全耦合度,是构建后台管理系统、内部运营平台的必备基础。在实际应用场景中,用户个人中心(

weixin_34347651的博客 524

基于springboot2+vue2社区智慧养老监护管理平台

社区智慧养老监护管理平台,旨在通过信息化手段对社区养老机构中的老人、房间、护工、后勤人员、体检员、物资申请、反馈留言等进行综合管理。 系统支持多角色登录(管理员、用户、体检员、后勤人员、护工),并为不同角色配置了差异化的功能权限。管理员可以对字典数据、房间信息、入住记录、反馈信息、人员信息、公告、物资申请等进行全面管理;普通用户(家属或老人)可以查看相关信息并提交物资申请和留言;护工、后勤人员、体检员则拥有特定的查看与管理权限。 平台基于前后端分离架构,后端提供RESTful API接口,前端采用Vue

210

SpringBoot宠物美容预约系统开发与优化实践

SpringBoot作为Java领域主流的轻量级框架,通过自动配置和起步依赖简化了企业级应用开发。其核心原理是基于约定优于配置的理念,内嵌Tomcat容器实现快速部署。在服务行业数字化改造中,SpringBoot特别适合开发像宠物美容预约系统这样的业务管理系统。通过整合MyBatis、Shiro等技术栈,可以快速实现预约流程标准化、业务数据可视化等核心功能。系统采用智能排期算法解决服务时间冲突检测等典型业务难题,运用策略模式实现动态定价策略。针对中小商户特点,提供从传统JAR到Docker的多形态部署方案,

weixin_33713707的博客 298

SpringBoot高校就业管理系统开发实战与优化

高校就业管理系统是结合业务逻辑与技术实践的典型应用,采用SpringBoot框架能快速构建MVC结构的Web应用。SpringBoot的约定优于配置特性简化了开发流程,特别适合毕业设计场景。通过整合MyBatis-Plus和Lombok等工具,可显著提升CRUD操作效率。系统设计需关注数据库规范与安全控制,如使用BCryptPasswordEncoder加密密码。核心功能包括智能匹配算法和数据可视化,其中智能匹配采用余弦相似度算法提升岗位与专业的匹配精度。数据可视化则通过ECharts实现就业率统计看板,结

weixin_34417200的博客 355

JimuReport 1.5.6在若依系统中的无缝集成:手把手教你打造可视化报表平台

本文详细介绍了如何将JimuReport 1.5.6与若依系统深度整合,打造企业级可视化报表平台。通过环境准备、核心集成技术解析、功能扩展与深度整合以及企业级部署方案,帮助开发者实现零编码报表设计,提升数据可视化能力。积木报表与若依系统的无缝结合,为企业数字化转型提供了强大支持。

wood5的博客 176

基于springboot2+vue3的医院挂号就诊系统

医院挂号就诊系统,基于Spring Boot + MyBatis-Plus + MySQL + Vue + layui等技术栈开发。系统主要面向三类角色:管理员、医生、用户(患者)。系统提供以下核心功能: 用户(患者)注册、登录、个人信息管理、余额充值。 医生管理:包括医生信息(姓名、科室、职位、职称、头像、联系方式、挂号价格、履历介绍等)的增删改查。 挂号管理:用户选择医生、时间类型(上午/下午)、挂号日期,生成就诊识别码,提交挂号申请。系统会校验用户余额,自动扣费,并生成审核记录。 健康教育:发布和管

199

基于SpringBoot2+vue2的可盈保险合同管理系统

可盈保险合同管理系统旨在提供一个平台来管理保险合同及相关信息。系统支持两种角色:管理员和普通用户(业务人员)。 管理员:可以对系统内的所有数据进行管理,包括用户信息、客户信息、保险合同、公告信息、留言反馈以及基础数据(如字典表)和系统配置(如轮播图)。管理员还可以回复用户的留言。 用户(业务人员):可以管理自己名下的客户信息、创建和管理保险合同、浏览公告以及发表留言。 系统核心功能围绕“合同”管理展开,允许用户为特定客户创建合同,并记录合同的类型、金额、受益人、执行与到期日期等关键信息。同时,系统提供了公

175

狂神说Java SpringBoot

一、运行原理初探 注解: //获取所有配置 protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes); 12 获取候选配置: protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationA

hxdshuaishuai的博客 681

探索高效开发新境界:Louislivi Fastdep框架

探索高效开发新境界:Louislivi Fastdep框架 在当今快速迭代的软件开发世界中,集成和管理各种依赖项常常耗费宝贵的时间。而Louislivi Fastdep框架正是为此问题提供解决方案的一个开源项目,它以简洁高效的方式帮助开发者快速集成常用公共依赖,提高开发效率,让你专注于核心业务逻辑。 项目介绍 Louislivi Fastdep是一套精心设计的框架集合,旨在简化Spring Boo...

gitblog_00025的博客 373

springboot珠宝首饰连锁店进销存管理系统

SpringBoot珠宝首饰连锁店进销存管理系统是为珠宝行业设计的数字化管理平台,通过整合商品管理、库存跟踪、销售分析、多门店协同等功能,提升企业运营效率与决策精准度。系统基于SpringBoot框架开发,结合MySQL数据库,实现高并发、模块化及可扩展性。

mind526的博客 396

基于SpringBoot2+vue2的装饰工程管理系统

装饰工程管理系统,旨在对装修公司的工程项目进行全流程信息化管理。系统涵盖从项目立项、预算报价、合同管理、材料计划到装修进度汇报的核心业务环节。 系统支持管理员、员工和客户三种角色。管理员负责基础数据配置和核心业务审核;员工(如项目经理)负责创建项目、管理预算、合同、材料和进度;客户则可以登录系统查看与自己相关的项目信息、合同及报价。

551
上一篇: shiro安全框架扩展教程--数据对象安全校验(oval框架)
下一篇: shiro安全框架扩展教程--验证码的安全(jcaptcha框架)
小丑哥_V5
博客等级 码龄15年 828粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值