Mybatis中的#和$的区别

在mybatis中,配置参数要用#,不要用\(符号。因为\)不安全,容易被sql注入。讲是这么讲,但是如何注入的,大家一起来看看吧。

一:下面我们写个关于“#”的个sql,看能不能注入。

 <select id="selectUser" resultMap="BaseResultMap">
    SELECT 
	    acc.user_name FROM dfws_sys_user_account AS acc
    WHERE
        acc.user_name like #{userName}
  </select>

1.正常传参

DfwsSysUserAccount user = new DfwsSysUserAccount();
user.setUserName("wanglingzhi");
List<DfwsSysUserAccount> list = userAccountService.selectUser(user);
if(list!=null && list.size()>0){
    for (DfwsSysUserAccount u:list) {
	    System.out.println("用户名:"+u.getUserName());
    }
}else{
        System.out.println("暂无数据");

}

sql打印:
Preparing: SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = ?
Parameters: wanglingzhi(String)

2.拼接传参

DfwsSysUserAccount user = new DfwsSysUserAccount();
user.setUserName("'wanglingzhi' or acc.user_name = 'shuizhong'");
List<DfwsSysUserAccount> list = userAccountService.selectUser(user);
if(list!=null && list.size()>0){
    for (DfwsSysUserAccount u:list) {
	    System.out.println("用户名:"+u.getUserName());
    }
}else{
        System.out.println("暂无数据");

}

sql打印:

Preparing: SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = ?

Parameters: wanglingzhi or acc.user_name = shuizhong(String)

二:下面我们写个关于“$”的个sql,看能不能注入。

<select id="selectUser" resultMap="BaseResultMap">
    SELECT 
	    acc.user_name FROM dfws_sys_user_account AS acc
    WHERE
        acc.user_name like ${userName}
  </select>

1.正常传参

DfwsSysUserAccount user = new DfwsSysUserAccount();
user.setUserName("'wanglingzhi'");
List<DfwsSysUserAccount> list = userAccountService.selectUser(user);
if(list!=null && list.size()>0){
    for (DfwsSysUserAccount u:list) {
        System.out.println("用户名:"+u.getUserName());
    }
}else{
        System.out.println("暂无数据");
}

打印sql:
SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = 'wanglingzhi'

2.拼接传参

DfwsSysUserAccount user = new DfwsSysUserAccount();
user.setUserName("'wanglingzhi' or acc.user_name = 'shuizhong'");
List<DfwsSysUserAccount> list = userAccountService.selectUser(user);
if(list!=null && list.size()>0){
    for (DfwsSysUserAccount u:list) {
	    System.out.println("用户名:"+u.getUserName());
    }
}else{
        System.out.println("暂无数据");
}

打印sql:
SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = 'wanglingzhi' or acc.user_name = 'shuizhong'

很显然,这里已经sql注入了。


-----理解一下:
这里有4个例子分别是:#的正常传参和拼接传参,\(的正常传参和拼接传参。#正常传参的情况下,可以获取到数据,#拼接传参的情况下,被mybatis拦截,所以无法获取到数据。\)正常传参和拼接传参都未被拦截,所以都可以获取到数据。也就出现了在$情况下的sql注入问题

posted @ 2020-02-11 21:55  今天有你便安好  阅读(238)  评论(0编辑  收藏  举报