mybatis点滴

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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值