iBatis的SQL注入问题
2015-11-03 15:26
543 查看
sqlMap中尽量不要使用$;$使用的是Statement(拼接字符串),会出现注入问题。#使用的是PreparedStatement(类似于预编译),将转义交给了数据库,不会出现注入问题;.前者容易出现SQL注入之类的安全问题,所以ibatis推荐使用#。
1、 正确使用$示例:ORDER BY $sortFieldName$ $sortType$,当参数是数据库字段名时这样使用是合适的,但一定注意这些参数一定不能是用户输入的。
2、 错误使用$示例:URL LIKE '%$URL$%',比如参数URL传进一个单引号“'”,生成的sql语句会是:URL like '%'%',这样肯定是会报错的,解决方法是利用字符串连接的方式来构成sql语句,此处应该改为: URL LIKE '%’||#URL#||’%'。
3、 错误的使用$一般都出现在 like后面,可以搜索 %$ 或者 $%。修改方法比较简单直接替换即可。%$替换为 %’||# , $%替换为#||’%。
综上:
对于like语句,难免要使用$写法,
1. 对于Oracle可以通过'%'||'#param#'||'%'避免;
2. 对于MySQL可以通过CONCAT('%',#param#,'%')避免;
3. MSSQL中通过'%'+#param#+'% 。
示例:
1.
<isNotEmpty prepend="and" property="name">
NAME like '%'||#name#||'%'
</isNotEmpty>
如果要考虑name走索引的情况那么上面这种语句是不会走索引的,除非写成:
#name#||'%'
走索引的情况只限定在'XX%'的like操作中,而'%XX'和'%XX%'无法使用索引
2.
还可以把判断null和'%'封装到一个方法里
<sql id="condition_where">
<isNotEmpty property="companyName" prepend=" and ">
t1.company_name like #companyName#
</isNotEmpty>
</sql>
if (!StringUtil.isEmpty(this.companyName)) {
table.setCompanyName("%" + this.companyName + "%");
}
3.
Oracle:
<select id="showOneStudentByName" parameterClass="String" resultMap="studentORM"﹥
select * from t_stu where s_name like '%'||#name#||'%'
﹤/select﹥
Mysql:
SELECT * FROM user
WHERE username like CONCAT('%', #username#, '%')
SQLServer :
SELECT * FROM user WHERE username like '%' + #username# + '%'
注意:SQL语句不要写成select * from t_stu where s_name like '%$name$%',这样极易受到注入攻击。
数据库字符串连接符:
Oracle: || 或 concat()
SQLServer: +
Mysql: concat()
db2: || 或 concat()
1、 正确使用$示例:ORDER BY $sortFieldName$ $sortType$,当参数是数据库字段名时这样使用是合适的,但一定注意这些参数一定不能是用户输入的。
2、 错误使用$示例:URL LIKE '%$URL$%',比如参数URL传进一个单引号“'”,生成的sql语句会是:URL like '%'%',这样肯定是会报错的,解决方法是利用字符串连接的方式来构成sql语句,此处应该改为: URL LIKE '%’||#URL#||’%'。
3、 错误的使用$一般都出现在 like后面,可以搜索 %$ 或者 $%。修改方法比较简单直接替换即可。%$替换为 %’||# , $%替换为#||’%。
综上:
对于like语句,难免要使用$写法,
1. 对于Oracle可以通过'%'||'#param#'||'%'避免;
2. 对于MySQL可以通过CONCAT('%',#param#,'%')避免;
3. MSSQL中通过'%'+#param#+'% 。
示例:
1.
<isNotEmpty prepend="and" property="name">
NAME like '%'||#name#||'%'
</isNotEmpty>
如果要考虑name走索引的情况那么上面这种语句是不会走索引的,除非写成:
#name#||'%'
走索引的情况只限定在'XX%'的like操作中,而'%XX'和'%XX%'无法使用索引
2.
还可以把判断null和'%'封装到一个方法里
<sql id="condition_where">
<isNotEmpty property="companyName" prepend=" and ">
t1.company_name like #companyName#
</isNotEmpty>
</sql>
if (!StringUtil.isEmpty(this.companyName)) {
table.setCompanyName("%" + this.companyName + "%");
}
3.
Oracle:
<select id="showOneStudentByName" parameterClass="String" resultMap="studentORM"﹥
select * from t_stu where s_name like '%'||#name#||'%'
﹤/select﹥
Mysql:
SELECT * FROM user
WHERE username like CONCAT('%', #username#, '%')
SQLServer :
SELECT * FROM user WHERE username like '%' + #username# + '%'
注意:SQL语句不要写成select * from t_stu where s_name like '%$name$%',这样极易受到注入攻击。
数据库字符串连接符:
Oracle: || 或 concat()
SQLServer: +
Mysql: concat()
db2: || 或 concat()
相关文章推荐
- SQL中的三值逻辑
- SQL Server 作业批量停止
- 结束SQL阻塞的进程
- 动态生成SQL Server视图作业
- SQL Server 语句操纵数据库
- SQL(结构化查询语句)
- oracle sql日期比较
- linux快速部署mysql服务器
- sql 存储过程分页
- 在WINXP系统上安装SQL Server企业版的方法
- 通过批处理调用SQL的方法(osql)
- SQL Server 存储过程的分页
- ASP程序与SQL存储过程结合使用详解
- SQL SERVER编写存储过程小工具
- 防御SQL注入攻击时需要注意的一个问题
- PostgreSQL教程(十九):SQL语言函数
- SQL Server复制需要有实际的服务器名称才能连接到服务器
- SQL Server 2000向SQL Server 2008 R2推送数据图文教程