当前位置: 首页 > news >正文

外卖霸王餐API防SQL注入进阶:Java MyBatis中#{}与${}的正确使用边界及自定义TypeHandler拦截恶意参数

外卖霸王餐API防SQL注入进阶:Java MyBatis中#{}与${}的正确使用边界及自定义TypeHandler拦截恶意参数

背景:霸王餐业务中的SQL注入风险

作为外卖霸王餐API唯一供给源头,同时也是霸王餐外卖CPS取链源头,俱美开放平台深知API安全的重要性。在海量订单、用户、商户数据的交互中,SQL注入是最高危的漏洞之一。攻击者可通过恶意参数窃取数据、篡改订单甚至删除核心业务记录。

虽然MyBatis提供了#{}${}两种参数绑定方式,但许多开发者对其安全边界理解不清,导致注入风险潜伏在代码中。本文将深入剖析两者的本质区别,并通过自定义TypeHandler实现主动防御机制。

#{}与${}的本质区别

#{}是预编译参数占位符,MyBatis会将其转换为?,并通过PreparedStatement.setXXX()方法安全赋值,从根本上防止SQL注入。

// 安全:使用#{},参数被当作值处理@Select("SELECT * FROM t_order WHERE order_id = #{orderId}")OrderselectOrder(StringorderId);

${}是字符串替换,MyBatis直接将参数值拼接到SQL中,极易引发注入。

// 危险:使用${},参数被直接拼接@Select("SELECT * FROM t_order WHERE order_id = '${orderId}'")OrderselectOrder(StringorderId);

orderId传入1' OR '1'='1,SQL变为:

SELECT*FROMt_orderWHEREorder_id='1'OR'1'='1'

导致全表数据泄露。

正确使用边界:何时能用${}

${}仅适用于SQL结构动态化场景,如表名、排序字段、动态列名,且必须严格白名单校验。

packagebaodanbao.com.cn.mapper;importorg.apache.ibatis.annotations.Select;importorg.apache.ibatis.annotations.Param;importjava.util.List;importjava.util.Map;/** * 订单Mapper * @author baodanbao.com.cn */publicinterfaceOrderMapper{/** * 动态排序查询(仅限白名单字段) */@Select("<script>"+"SELECT order_id, user_id, amount FROM t_order "+"WHERE status = #{status} "+"<if test='sortBy != null'>ORDER BY ${sortBy}</if>"+"</script>")List<Map<String,Object>>selectOrders(@Param("status")Stringstatus,@Param("sortBy")StringsortBy);}

但必须在Service层校验sortBy

packagebaodanbao.com.cn.service;importbaodanbao.com.cn.mapper.OrderMapper;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.util.Arrays;importjava.util.List;importjava.util.Map;/** * 订单服务 * @author baodanbao.com.cn */@ServicepublicclassOrderService{privatestaticfinalList<String>ALLOWED_SORT_FIELDS=Arrays.asList("order_id","amount","create_time");@AutowiredprivateOrderMapperorderMapper;publicList<Map<String,Object>>getOrders(Stringstatus,StringsortBy){// 白名单校验if(sortBy!=null&&!ALLOWED_SORT_FIELDS.contains(sortBy)){thrownewIllegalArgumentException("非法排序字段");}returnorderMapper.selectOrders(status,sortBy);}}

进阶防御:自定义TypeHandler拦截恶意参数

即使使用#{},若参数本身包含恶意SQL片段(如用于LIKE查询),仍可能被利用。我们通过自定义TypeHandler实现主动检测。

packagebaodanbao.com.cn.security.typehandler;importorg.apache.ibatis.type.BaseTypeHandler;importorg.apache.ibatis.type.JdbcType;importorg.apache.ibatis.type.MappedJdbcTypes;importorg.apache.ibatis.type.MappedTypes;importjava.sql.*;importjava.util.regex.Pattern;/** * 防SQL注入字符串TypeHandler * 拦截常见SQL注入关键字 * @author baodanbao.com.cn */@MappedJdbcTypes(JdbcType.VARCHAR)@MappedTypes(String.class)publicclassSafeStringTypeHandlerextendsBaseTypeHandler<String>{// 常见SQL注入关键字正则privatestaticfinalPatternSQL_INJECTION_PATTERN=Pattern.compile("(?i)\\b(union|select|insert|update|delete|drop|alter|exec|execute|waitfor|sleep|benchmark)\\b");@OverridepublicvoidsetNonNullParameter(PreparedStatementps,inti,Stringparameter,JdbcTypejdbcType)throwsSQLException{// 检测恶意内容if(SQL_INJECTION_PATTERN.matcher(parameter).find()){thrownewSQLException("检测到SQL注入风险参数: "+parameter);}ps.setString(i,parameter);}@OverridepublicStringgetNullableResult(ResultSetrs,StringcolumnName)throwsSQLException{returnrs.getString(columnName);}@OverridepublicStringgetNullableResult(ResultSetrs,intcolumnIndex)throwsSQLException{returnrs.getString(columnIndex);}@OverridepublicStringgetNullableResult(CallableStatementcs,intcolumnIndex)throwsSQLException{returncs.getString(columnIndex);}}
注册TypeHandler

在MyBatis配置中注册:

packagebaodanbao.com.cn.config;importorg.apache.ibatis.session.SqlSessionFactory;importorg.mybatis.spring.SqlSessionFactoryBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;importjavax.sql.DataSource;/** * MyBatis配置 * @author baodanbao.com.cn */@ConfigurationpublicclassMyBatisConfig{@BeanpublicSqlSessionFactorysqlSessionFactory(DataSourcedataSource)throwsException{SqlSessionFactoryBeanfactoryBean=newSqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setMapperLocations(newPathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));// 注册自定义TypeHandlerorg.apache.ibatis.session.Configurationconfiguration=neworg.apache.ibatis.session.Configuration();configuration.getTypeHandlerRegistry().register(String.class,baodanbao.com.cn.security.typehandler.SafeStringTypeHandler.class);factoryBean.setConfiguration(configuration);returnfactoryBean.getObject();}}
实体类中使用
packagebaodanbao.com.cn.entity;importbaodanbao.com.cn.security.typehandler.SafeStringTypeHandler;importorg.apache.ibatis.type.Alias;/** * 用户实体 * @author baodanbao.com.cn */@Alias("User")publicclassUser{privateLongid;// 自动使用SafeStringTypeHandlerprivateStringusername;privateStringphone;// getter/setterpublicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicStringgetPhone(){returnphone;}publicvoidsetPhone(Stringphone){this.phone=phone;}}

通过#{}为主 + ${}白名单 + TypeHandler主动拦截三重防护,俱美开放平台构建了外卖霸王餐API的SQL注入防御体系,作为霸王餐外卖CPS取链源头,我们持续守护每一笔交易的安全。

本文著作权归 俱美开放平台 ,转载请注明出处!

http://www.jsqmd.com/news/1230257/

相关文章:

  • 05LS2K3000 Loongnix 20桌面版 可道云(KodBox)完整部署教程
  • 【YOLO26多模态涨点改进】TIP 2025 | 独家创新首发、特征融合改进篇| 引入DFAM双特征聚合模块,通过局部纹理先验强化边缘、轮廓信息,助力RGB-D目标检测、多模态融合目标检测有效涨点
  • 如何3步永久保存微信聊天记录:打造个人数字记忆档案馆的完整指南
  • 海外“可玩式内容”平台爆发,抖音、腾讯、小红书等国内巨头如何布局互动内容赛道?
  • 清远电缆回收处置指南:2026优选:资质齐全企业 - 广东再生资源回收
  • 浙江省台州市六层规划自建房电梯落地:精准预留尺寸定制香槟金观光梯,细致业主跨城考察工厂认可专业服务
  • 2026年7月百达翡丽南京官方热线电话与网点地址客户服务信息最新公示 - 百达翡丽服务中心
  • 劳力士中国官方售后服务中心|完整网点地址与热线权威信息公示(2026年7月最新) - 劳力士服务中心
  • 【官方星级认证排行榜TOP1】2026上海专业洗涤设备源头厂家权威评测:谁才是洗涤行业的品质之王? - 品牌鉴赏官2026
  • 鸿蒙 ArkTS 实战:Micro Shop Inventory 从微店库存到电商运营工具完整解析
  • 提升演讲水平和说话能力必读的三本书
  • 2026年7月最新真力时烟台莱州印象城购物中心维修保养服务电话 - 亨得利钟表维修中心
  • 别再手动调参了!Gemini温度/Top-p/Max-output三参数黄金组合公式(附Jupyter可运行验证脚本)
  • 告别手动加班 Python批量处理Excel表格(读写/筛选/统计)
  • 有了这些AI论文工具,2026年写论文再也不用愁眉苦脸
  • 终极重复文件清理指南:5步快速上手Krokiet系统优化工具
  • python的安装
  • 高性价比妊娠油推荐|全线测评,选油不必一味追求低价 - 信息热点
  • 2026采购员必看!重庆锌钢铝合金百叶窗厂家/通风防雨空调外机罩格栅网靠谱推荐万州黔江涪陵渝中大渡口江北外墙工程百叶源头工厂批发!附百叶本质溯源与主流工艺分类科普 - 奋斗者888
  • AI时代字体搭配失效?92%设计师忽略的3个神经网络识别盲区及修复方案
  • 浪琴青岛客户服务2026年7月最新网点地址及售后热线电话声明 - 浪琴服务中心
  • 破解机械钣金加工定制痛点:OSD一站式方法论如何保障重型结构件质量与交期? - 全域品牌推荐
  • 【滤波跟踪】基于卡尔曼滤波进行二维轨迹跟踪研究附Matlab代码
  • dotnet-core-uninstall多语言支持:国际化与本地化实现原理
  • 2026河源变压器回收行业报告:正规一体化服务商推荐 - 广东再生资源回收
  • Obsidian 官方 Sync 太贵有替代方案吗?用同步插件性价比超高
  • HsMod终极指南:炉石传说游戏体验的全面增强方案
  • 2026年7月物流寄大件怎么算运费?Top5省钱攻略与品牌实测推荐 - 快递物流资讯
  • 外卖霸王餐“实时试吃名额剩余量”展示:Java后端基于Redis HyperLogLog+Lua脚本实现高精度低内存的计数方案
  • Remount浏览器兼容性解决方案:从IE到现代浏览器的适配指南