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

简介:            相信每一个项目都会存在文件上传功能,最常见的就是图片,音频,视频等上传,但是如果用户多的应用都会存在用户恶意上传动作,包括伪装成可上传文件,按照我们以往的方式,普通地...

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

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


下面举例个简单的攻击


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,应该算是正常合法的,所以这个时候应该把当前后缀全部匹配下图片的魔数

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


目录
相关文章
|
6月前
|
传感器 边缘计算 人工智能
2025大模型应用平台选型指南:从个人助手到企业级智能体,5大平台场景化拆解
本文深度评测五大主流大模型平台,结合金融、医疗、制造实战案例,解析Open WebUI、Dify、Ragflow、FastGPT与n8n的定位与优势,提供选型决策树与混合架构实例,助你精准匹配业务需求,避开“全能平台”陷阱,实现高效智能化落地。
|
数据可视化 数据库
通义灵码个人版新功能最佳实践测评
作为一名软件开发工程师,我使用通义灵码个人版的@workspace和@terminal功能,快速熟悉新的电商项目代码并实现新功能,效率提升了约30%。通过自动识别项目结构、代码分析、智能注释和自动补全等功能,大幅减少了查找资料和调试的时间,使开发流程更加顺畅,专注于业务逻辑实现。
391 1
|
数据采集 监控 算法
PID 控制器有什么优缺点?
PID 控制器有什么优缺点?
476 1
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
这篇文章介绍了如何使用Ant Design Vue UI框架创建一个简单的后台管理模板,包括创建Vue项目、安装和使用ant-design-vue、以及编写后台管理通用页面的代码和样式。
Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】
|
存储 数据管理 调度
鸿蒙操作系统如何支持不同设备的适配和兼容性?
鸿蒙操作系统如何支持不同设备的适配和兼容性?
2298 2
|
存储 域名解析 网络安全
阿里云对象存储OSS及CDN加速配置
目录 十大云存储服务商 登陆阿里云官网,开通对象存储服务 OSS 创建存储空间 绑定自定义域名 配置阿里云CDN加速 购买阿里云免费SSL证书 阿里云CDN配置HTTPS证书 测试是否配置成功 创建阿里云子账户,获取访问密钥 到此为止,项目中对接阿里云对象存储OSS所需参数都有了
1099 1
|
机器学习/深度学习 分布式计算 算法
阿里凑单算法首次公开!基于Graph Embedding的打包购商品挖掘系统解析
你是否也曾遇到类似的情况——差5块钱就能包邮,跨店满400减50就少20怎么办?凑单作为购物券导购链路的一个重要环节,旨在帮助你找到合适的商品。如何在凑单场景突破找相似、发现惊喜的同时做到成交翻倍,实现体验和数据上的双赢?今天我们一起来破解。
8113 0
|
21天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
32793 128
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
17天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
6972 20
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手

热门文章

最新文章