ibatis和sql
Ibatis是一个半自动框架,所谓的半自动,就是可以以比hibernate自由的多的形式来写sql,来执行sql的框架。
Ibatis的sql都是通过xml配置,其中,可以使用insert,update,delete,select,sql,statement,procedure,include这些标签来增强sql的自由性。
Ibatis的标签
映射语句的类型和相关的xml有:
语句类型 |
属性 |
子元素 |
用途 |
select |
Id parameterClass resultClass parameterMap resultMap cacheModel |
所有动态元素 |
用于选择 |
Insert |
Id parameterClass parameterMap |
所有动态元素 selectKey |
插入 |
update |
Id parameterClass parameterMap |
所有动态元素 |
更新 |
delete |
Id parameterClass parameterMap |
所有动态元素 |
删除 |
procedure |
Id parameterClass resultClass parameterMap resultMap xmlResultName |
所有动态元素 |
调用存储过程 |
statment |
Id parameterClass resultClass parameterMap resultMap xmlResultName |
所有动态元素 |
可以代表所有语句的类型,几乎可以用来执行所有的操作 |
sql |
Id |
所有动态元素 |
Sql片段 |
Include |
refid |
无 |
可以用来将<sql>片段插入到已经映射的语句中 |
Sql注入
SQL注入攻击(SQL injection),简称注入攻击,是发生于数据库层的安全漏洞。简单的说,是在输入的数据字符串之中夹带SQL指令,如果在设计不良的程序当中忽略了检查,那么这些夹带进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此破坏系统。
例如:
某个网站的登录验证的SQL查询代码为
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
恶意填入
userName = "' OR '1'='1";
与
passWord = "' OR '1'='1";
时,将导致原本的SQL字符串被填为
strSQL = "SELECT * FROM users WHERE (name = '' OR '1'='1') and (pw = '' OR '1'='1');"
也就是实际上运行的SQL命令会变成下面这样的
strSQL = "SELECT * FROM users;",导致将所有的信息查询出来。
Ibatis的#和$
对于一条简单的sql语句,例如:
Select * from user where id=#id#
Ibatis会把sql预编译为
select * from user where id=?
接着会把传入的值进行填充,类似于jdbc的preparestatment的形式。
之前的sql是简单的形式,加入需要用到模糊查询的like就比较麻烦,而且可能会出现sql注入的情况。
假如需要查询用户名中带"sa"的用户,可能会这样来写sql
select * from user where name like '%sa%'
但是在ibatis的xml中不能这样写,如果写成
select * from user where name like #%sa%#或者like %#sa#%是肯定不行的,会有报错。
有个很简单的办法,就是写成
select * from user where name like '%$name$%'
的样子,$符号会把参数原样嵌入sql语句中而不进行预编译,这就使得有可能出现sql注入攻击。其实ibatis从根本上简单的说,凡是#的,都作为参数,用setobject方式预编译。而$方式的,则直接替换字符串。 所以说,$很不安全,会把用户的输入直接当参数放入sql。
结论:最好不要用like来进行查询,1是因为效率低,2是因为在ibatis里使用是相当麻烦的,可读性很差,如果真的要用,不要使用$,而是使用#的like拼凑形式:
select * from user where name like '%'||#name#||'%';