尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
外卖霸王餐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 11SQL变为SELECT*FROMt_orderWHEREorder_id1OR11导致全表数据泄露。正确使用边界何时能用${}${}仅适用于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(scriptSELECT order_id, user_id, amount FROM t_order WHERE status #{status} if testsortBy ! nullORDER BY ${sortBy}/if/script)ListMapString,ObjectselectOrders(Param(status)Stringstatus,Param(sortBy)StringsortBy);}但必须在Service层校验sortBypackagebaodanbao.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{privatestaticfinalListStringALLOWED_SORT_FIELDSArrays.asList(order_id,amount,create_time);AutowiredprivateOrderMapperorderMapper;publicListMapString,ObjectgetOrders(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)publicclassSafeStringTypeHandlerextendsBaseTypeHandlerString{// 常见SQL注入关键字正则privatestaticfinalPatternSQL_INJECTION_PATTERNPattern.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{SqlSessionFactoryBeanfactoryBeannewSqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setMapperLocations(newPathMatchingResourcePatternResolver().getResources(classpath*:mapper/*.xml));// 注册自定义TypeHandlerorg.apache.ibatis.session.Configurationconfigurationneworg.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.idid;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.usernameusername;}publicStringgetPhone(){returnphone;}publicvoidsetPhone(Stringphone){this.phonephone;}}通过#{}为主 ${}白名单 TypeHandler主动拦截三重防护俱美开放平台构建了外卖霸王餐API的SQL注入防御体系作为霸王餐外卖CPS取链源头我们持续守护每一笔交易的安全。本文著作权归 俱美开放平台 转载请注明出处
RELATED

相关推荐

Java后端对接美团霸王餐API时如何通过“证书双向认证+请求签名”防止请求篡改

Java后端对接美团霸王餐API时如何通过“证书双向认证+请求签名”防止请求篡改

Java后端对接美团霸王餐API时如何通过“证书双向认证请求签名”防止请求篡改 背景:霸王餐API安全通信的必要性 作为外卖霸王餐API唯一供给源头,同时也是霸王餐外卖CPS取链源头,俱美开放平台在与美团等大型平台进行数据交互时,通信…

📅 2026/10/30 0:54:44
C++语言算法教程——递归

C++语言算法教程——递归

引子 我们经常遇到 “递归” 这个名词,却不知道是什么意思,今天我们就讲一下递归 什么是递归 看这是递龟: 好了,我们讲完了 Y(^o^)Y 哈哈😄开个玩笑,我么我们来讲一个故事,听懂了&#xff…

📅 2026/10/9 10:38:23
生命游戏C++代码initgraph窗口版(有功能未开放)

生命游戏C++代码initgraph窗口版(有功能未开放)

由于作者实力较弱&#xff0c;代码可能产生漏洞&#xff0c;请原谅&#xff01;&#xff01; #include <bits/stdc.h> #include <graphics.h> #include <conio.h> #include <thread> #include <mutex> #include <chrono> #include <cst…

📅 2026/10/6 15:44:00
MORE NEWS

更多资讯

📰

JavaScript逃逸与备份文件提权实战

1. 靶机渗透实战概述最近在HackTheBox平台上挑战了CodePartTwo靶机&#xff0c;这是一台涉及JavaScript逃逸和备份文件提权的Linux系统。整个过程充满了技术细节和思维突破点&#xff0c;特别适合想要提升Web渗透和权限提升技能的安全爱好者。这台靶机的设计巧妙之处在于&#…

📰

Lumia老设备复活:WPinternals解锁Bootloader与刷机恢复

1. 为什么还有人折腾Lumia&#xff1a;硬件底子、系统现状与真实用途抽屉里翻出一台还能开机的Lumia&#xff0c;这件事本身就挺有意思。它当年是Windows Phone阵营里做工和影像都不含糊的一批机器&#xff0c;金属中框、光学防抖、纯景拍照&#xff0c;放到今天拿在手里&#…

📰

Spark Job执行流程与调度机制深度解析

1. Spark Job 执行流程全景透视 当我们在Spark应用中调用一个Action算子时&#xff0c;背后会触发一系列复杂的调度与执行过程。这个看似简单的操作实际上经历了DAG构建、Stage划分、Task调度等多个关键阶段。理解这个完整流程对于性能调优和故障排查至关重要。 以最常见的col…

📰

水电表数据智能处理与能耗分析系统实践

1. 项目背景与核心价值水电表数据管理一直是物业、园区和大型企事业单位后勤管理的痛点。传统手工抄表方式不仅效率低下&#xff0c;还容易出错。即使采用了自动化抄表系统&#xff0c;如何高效处理累计值数据、实现灵活查询分析仍是行业难题。这个项目要解决的正是这个痛点——…

📰

OpenClaw开源智能监测系统:低成本小龙虾养殖方案

1. 项目概述&#xff1a;OpenClaw 是什么&#xff1f; OpenClaw 是一个专门为小龙虾养殖行业设计的开源智能监测系统。它能实时采集养殖池的水温、PH值、溶解氧等关键指标&#xff0c;通过算法分析给出投喂建议和风险预警。我在江苏盱眙的养殖场实测三个月&#xff0c;这套系统…

📰

双线性并行傅里叶Transformer多模态遥感分类实战

多模态遥感分类这件事&#xff0c;我从早年"光谱维拼几何特征再喂给核方法"一路做到现在的注意力融合&#xff0c;踩过的坑能串成一条完整的线。高光谱给的是上百个窄波段的光谱曲线&#xff0c;激光雷达给的是单通道高程几何&#xff0c;合成孔径雷达给的是后向散射…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬