巧用正则批量替换IBATIS中的sql参数注入方式

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

        最近发现如果sql语句比较长,且参数比较多的时候(很多很多?),在sqlserver2000上预编译速度超慢,sqlserver2005快一倍左右,但还是没有直接执行静态的sql快,本来2秒就能搞定,结果在2000上要20多秒,2005上要10秒左右,jtds驱动预编译更慢. 真是比较晕,为了解决性能问题只能抛弃PreparedStatement了,直接拼装sql执行。好像跑题了,在IBATIS中使用PreparedStatement预编译sql,在定义参数的时候只要写成#id:INTEGER#即可了,如果要直接替换字符串需要改写为'$id$',如果一个一个文件手工修改的话那就太麻烦了,于是写了个正则小程序。因为代码实在太简单了,没啥可注释的,也没什么技术含量,发出来可能会帮助到一些懒人,呵呵。另外过几天有时间的时候要整理整理正则的东西了,每次写正则都不顺利嗨。

后记:替换后还是有些小工作要做的,因为在sqlserver中null和 '' 的含义是不相同的,一些诸如#id:INTEGER# is null的写法就不灵了。

public class ReplacePara {
    
public static void main(String[] args) throws IOException {
        File dir 
= new File("src/main/resources/com/xxxx/xxxx/model/sqlserver/");
        File[] files 
= dir.listFiles(new FileFilter() {
            
public boolean accept(File pathname) {
                
if (pathname.getName().startsWith("demo.xml"))
                    
return true;
                
return false;
            }
        });
        
for (int i = 0; i < files.length; i++) {
            File file 
= files[i];
            
if (file.exists() && file.isFile()) {
                replaceFile(file);
            }
        }
    }

    
public static void replaceFile(File file) {
        
try {
            String str 
= org.apache.commons.io.FileUtils.readFileToString(file,
                    
"UTF-8");
            str 
= str.replaceAll("#([^#]+?):(VARCHAR|INTEGER&&[^#])#",
                    
"'/$$1/$'");
            org.apache.commons.io.FileUtils.writeStringToFile(file, str,
                    
"UTF-8");
        } 
catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Java开发中SQL注入防御全解析:从PreparedStatement到MyBatis最佳实践 SQL注入是一种常见且危害极大的Web安全漏洞,其本质在于攻击者能够将恶意构造的数据作为SQL代码的一部分执行,从而绕过应用层逻辑直接操作数据库。其核心防御原理在于严格区分数据与代码,通过参数化查询确保用户输入始终被当作数据处理,而非可执行的指令。在Java技术栈中,这一原理主要通过预编译机制实现技术价值,它能从根本上杜绝大部分注入攻击。具体到工程实践,开发者需要深入理解JDBC的PreparedStatement工作机制,并掌握主流ORM框架如MyBatis中#{}与${}操作符的关键区别。正确的应用场景 阅读详情

相关推荐

MyBatis #{}} 与 ${} 的本质区别:从SQL解析链路看注入防御机制

SQL注入防御的核心在于区分‘数据’与‘结构’——预编译(PreparedStatement)仅对值参数生效,而表名、列名、排序字段等SQL结构参数必须通过白名单校验+安全拼接实现防护。MyBatis中#{}触发DynamicSqlSource与参数绑定流程,${}则生成RawSqlSource并绕过JDBC预编译,导致数据库直接解析恶意字符串。理解SqlSource构建、BoundSql生成及Executor执行三层机制,才能在动态ORDER BY、分表路由、IN条件等高频场景中精准设防。本文深入MyBa

weixin_34186128的博客 381

ibatis例子加教程&java&javascript&dhtml&正则表达式工具

ibatis例子加教程&java&javascript&dhtml&正则表达式工具

企业级SQL注入漏洞深度剖析:从原理到修复的完整实战指南

SQL注入作为Web安全领域的经典漏洞,其核心原理在于应用程序未严格区分数据与代码,导致用户输入被误执行为数据库指令。这种漏洞源于动态SQL拼接与输入验证缺失,使得攻击者能够操纵数据库查询逻辑,从而引发数据泄露、权限提升乃至系统沦陷等严重后果。在企业级应用如ERP、CRM系统中,由于业务逻辑复杂、历史代码众多,SQL注入往往成为高危风险点。通过手工探测结合自动化工具(如SQLMap),安全人员可以系统性地验证漏洞存在、提取敏感信息并评估潜在危害。而根本的防御之道在于代码层采用预编译语句(PreparedSt

weixin_30832405的博客 340

通过ibatis解决sql注入问题

主要介绍了通过ibatis解决sql注入问题,需要的朋友可以参考下

正则表达式

首先说两个概念,在后面我们会用到它们: metacharacter--元字符,即在正则表达式中有特殊意义的一些字符 A metacharacter is one or more special characters that have a unique meaning, for example, the character ^ (circumflex or caret) is a metach

我的学习成长日记 1050

iBatisSQL注入

sqlMap中尽量不要使用$;$使用的是Statement(拼接字符串),会出现注入问题。#使用的是PreparedStatement(类似于预编译),将转义交给了数据库,不会出现注入问题;.前者容易出现SQL注入之类的安全问题,所以ibatis推荐使用#。 1、正确使用$示例:ORDER BY $sortFieldName$ $sortType$,当参数是数据库字段名时这样使用是合适的,但...

weixin_30349597的博客 174

ibatis动态sql入门

本例以上一讲中的老师表为基础,演示ibatis的动态sqlsqlMap中这样写: select * from teacher name like %$name$% subject = #subject# order by name  java中这

人在旅途 4403

mybatis like %% 模糊查询防sql 注入

所以解决的思路是:sql中应该跟正常的替换方式相同,ibatis并没有提供特殊写法,应该在传入的参数上下功夫。 也就意味着需要自己来做转译。 SQL文: select * from A where A.name like #{key} java端对Key值进行转译:     public static String transfer(String keyword)

1万+

SQL注入攻防全解析:从原理到实战防御

SQL注入是一种常见的Web安全漏洞,其核心原理在于程序未能正确区分用户输入的**数据**与可执行的**代码**,导致攻击者能够通过精心构造的输入,操纵后端数据库查询逻辑。理解这一漏洞需要掌握其利用方式,如联合查询、报错注入和盲注等技术,这些技术常被用于渗透测试和CTF挑战中。从防御角度看,最根本的解决方案是采用**预编译(参数化查询)**,它能彻底分离SQL语句结构与参数数据,从而消除注入风险。在开发实践中,尤其是在使用MyBatis等ORM框架时,必须严格区分`#{}`与`${}`的使用场景,避免因动态

weixin_33908217的博客 371

iBATIS sql中的处理特殊符号的做法

1.做过html就知道,其实就是xml的特殊符号,需要做个转义&amp;lt; &lt; &amp;gt;&gt; &amp;lt; &lt; &amp;gt; &gt; &amp;amp; &amp; &amp;apos; ' &amp;quot; " 2.建议使用&lt;![CDATA[ ]]&gt;符号进行统一说明,将此符号内的任何文本不进行解

iteye_14984的博客 78

模拟ibtais参数注入的过程

使用Ibatis时,只需要把sql语句写好,指明需要注入参数对应对象中的属性就可以了。这样极大的提高了开发效率。 我在工作过程中,遇到了一些场景,需要自己去直接连接JDBC写数据库,我又想模拟Ibatis自动补全参数的功能,所以就写了下面的这些代码。欢迎指证批评。   创建数据库连接的代码 import java.sql.Connection; import java.sql.D...

mesum的专栏 202

SpringBoot双重防御体系:SpringSecurity集成XSS与SQL注入协同防护实践

在Web应用开发中,安全防护是保障系统稳定与数据安全的核心环节。其基本原理在于对不可信数据进行严格的验证、净化和安全处理,防止恶意输入破坏应用逻辑或窃取数据。从技术价值看,构建纵深防御体系能显著提升应用的整体安全性,降低被自动化攻击工具突破的风险。常见的应用场景包括用户输入处理、数据库操作和动态内容渲染等关键环节。本文聚焦于利用SpringSecurity作为安全基座,结合MyBatis-Plus的参数化查询与Thymeleaf的自动转义机制,系统性地应对XSS跨站脚本攻击和SQL注入这两大常见威胁,实现从

weixin_33701564的博客 402

java过滤防止sql注入过滤

/** * 过滤特殊字符 * @author: Simon * @date: 2017年8月31日 下午1:47:56 * @param str * @return */ public static String StringFilter(String str){ str = str.replaceAll("", ">"); str = str.replaceAll("\

SimonHu的博客 1088

java美元兑换_代码中的美元$

这个题目其实有点标题党了,其实本篇文章主要内容应该是说“代码中的美元符号(dollar sign)”。想总结一下我所看到的美元符号在代码中的起到的作用,当然了并不是说它作为格式化字符时出现在数字前当钱币单位的作用。有效的变量名在取变量名的时候,我们通常都只使用字母,数字,下划线,而且数字不能作为开头。但是在很多编程语言中,对于变量名的限定更宽泛,很多特殊字符也可以作为变量名,当然也包括$。Jav...

weixin_42109925的博客 476

【Doris系列05】上岗实操篇:零基础搞定生产所有写入&查询开发(Shell/Python/Java全覆盖)

✅ 支持JSON流式导入,适配90%现代业务JSON数据源,远超基础CSV导入✅GZIP数据压缩,大数量导入吞吐量提升50%+,减少网络传输压力✅ 自动处理Doris307 FE→BE重定向,彻底解决线上导入偶发失败问题✅ 毫秒级幂等Label、完整日志链路、精准成功失败判定,适配线上排查✅ 零第三方重度依赖、线程安全、可直接接入业务接口、定时任务/*** 按分区日期查询用户行为明细* @param dt 分区日期* @return 明细列表/**

苍煜 305

JavaScript字符串操作全解析:从基础方法到性能优化实战

字符串作为编程中的基础数据类型,在JavaScript中通过UTF-16编码实现字符存储。其不可变特性决定了所有修改操作都会返回新字符串,这一原理直接影响代码性能表现。理解字符串的编码机制和操作方法对提升代码质量具有重要价值,特别是在用户输入验证、数据格式化和模板渲染等应用场景中。本文基于indexOf和模板字符串等热词,深入解析JavaScript字符串的核心操作技巧与常见问题解决方案,帮助开发者掌握高效的字符串处理实践方法。

weixin_30861797的博客 454

MyBatis-Plus字段加解密实战:保障MySQL敏感数据安全

数据安全是应用开发的核心议题,尤其在处理用户手机号、身份证等敏感信息时,防止数据泄露至关重要。在应用层对敏感字段进行加密存储是一种常见的安全实践,其原理是在数据写入数据库前进行加密,读取时再解密,从而确保即使数据库被非法访问,敏感信息也不易被直接获取。这项技术的核心价值在于将安全策略与业务逻辑解耦,提升代码的可维护性和安全性。在实际的工程实践中,ORM框架如MyBatis-Plus通过其拦截器或TypeHandler机制,能够以声明式、无侵入的方式自动完成字段的加解密,极大地简化了开发流程。然而,实现过程中

weixin_34161083的博客 480

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+
上一篇: 使用java调用存储过程的通用封装
下一篇: 常用细线表格的CSS实现
sunyujia
博客等级 码龄19年 1478粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值