Skip to content
This repository has been archived by the owner on Jul 22, 2022. It is now read-only.

loxia like 防止 sql 注入

feilong edited this page Mar 1, 2019 · 3 revisions

loxia like 防止 sql 注入

0. loxia 简介:

loxia https://github.com/benjaliu/loxia2-repo/tree/master/releases/loxia2 是一款类似于 mybatis 的优秀持久层框架,支持定制化 SQL、存储过程以及高级映射。

loxia 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

1. loxia like 背景

前些天, 雷哥找我咨询 like 避免 sql 注入的问题, 我提供了简单的思路

2.使用方式,第1步 xml

<bean id="HypeRiskResult.findMaliciousMemberByEmail" class="loxia.dao.support.DynamicQueryHolder">
	<constructor-arg>
		<value>
			<![CDATA[  
				select 
					id
				from member 
				where 
					email like :email
			]]>
		</value>
	</constructor-arg>
</bean>

3. 使用方式,第2步java 调用

List<HypeRiskResultCommand> results = riskResultDao.findMaliciousMemberByEmail("%" + email.getRestrictions() + "%");

4. 原理

PreparedStatement 使用like https://blog.csdn.net/wangcunhuazi/article/details/47067389

在使用PreparedStatement进行模糊查询的时候废了一番周折,

一般情况下我们进行精确查询,sql语句类似: select * from table where name =?, 然后调用 PreparedStatementsetString 等方法给 ? 指定值。

那么模糊查询的时候应该怎么写呢?

4.1 尝试1

先尝试了: select * from customer where name like '%?%'

程序报错,因为 ? 被包含在了单引号中,PreparedStatement 并不视它为一个参数。

4.2 尝试2

发现可以这样写 select * from table where name like ?

在指定参数的时候把 ? 指定为 ”%”+name+”%” , name 是指定的查询条件, 这样就OK了

一般情况下,潜意识的认定了 ? 就是取代所指定的参数, 实际上可以对指定的参数进行了包装之后再传给?,如此处在参数的前后都加了一个%,然后再传给 ?

String expr = "select * from table where url like ?";
pstmt = con.prepareStatement(expr);

String a="a";
pstmt.setString(1, "%"+a+"%");//自动添加单引号 (包装后的参数)
pstmt.execute();

System.out.println(pstmt.toString());//打印sql
//会默认生成sql:  select * from  table where url like '%http%'

🌀 feilong 即时交流

QQ 群 243306798

🐼 About

如果您对本项目有任何建议和批评,可以使用下面的联系方式: