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#||'%';
ibatis insert返回自增主键的值
ms sqlserver
<insert id="insertXXXX" parameterClass="com.test.model.XXXX" >
insert into TableName(………略
<selectKey resultClass="java.lang.Integer" keyProperty="id" >
SELECT @@IDENTITY AS id
</selectKey>
</insert>
oracle:
<selectKey resultClass="int" keyProperty="id" >
SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
</selectKey>
mysql:
<insert id="insertUserEntity" parameterType="java.util.HashMap"><selectKey resultType="java.lang.Integer" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
<![CDATA[
INSERT INTO `tab_user_one`
values( )
]]>
)
</insert>