-
#{}经过预编译,是安全的,而**${}未经过预编译,可能存在SQL注入的风险**
什么是SQL注入?
通过SQL命令插入到web表单提交或输入域名或页面请求的查询字符串,以达到欺骗服务器执行恶意SQL命令的目的
常见的有匿名登陆(在登陆框输入恶意字符串)、借助异常获取数据库信息等匿名登陆: 1. 正常登陆的SQL语句 SELECT * FROM USERS WHERE USERNAME='Tom' AND PASSWORD=MD5('123') 2. SQL注入 SELECT * FROM USERS WHERE USERNAME='' or 1=1#' AND PASSWORD=MD5('') 攻击者输入'' or 1=1#',#表示注释过滤其后语句,而1=1永远成立,使得登陆成功
-
${}一般用于传入数据库对象,获取配置文件数据接口的参数信息
例:
1. SELECT * FROM #{TABLE_NAME} ==> SELECT * FROM ? ==> SELECT * FROM 'tableName' ==> SQL语法错误 2. SELECT * FROM ${TABLE_NAME} ==> SELECT * FROM tableName
所以mybatis排序使用order by 动态参数时,使用$而不是#
-
#{}的参数替换发生在数据库管理系统DBMS中,而${}发生在动态解析过程中
编译时
#{}使用?在编译的SQL语句中进行占位
${}将参数拼接直接替换进编译的SQL语句 -
mysql中存在隐式转换,若查询字符串使用${}进行拼接,会造成转义,导致索引失效
浅析mybatis的#与$区别
最新推荐文章于 2021-09-17 00:09:45 发布