浅析mybatis的#与$区别

  1. #{}经过预编译,是安全的,而**${}未经过预编译,可能存在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永远成立,使得登陆成功
    
  2. ${}一般用于传入数据库对象,获取配置文件数据接口的参数信息

    例:

    1. SELECT * FROM #{TABLE_NAME}
    	==> SELECT * FROM ? ==> SELECT * FROM 'tableName' ==> SQL语法错误
    2. SELECT * FROM ${TABLE_NAME}
    	==> SELECT * FROM tableName
    

    所以mybatis排序使用order by 动态参数时,使用$而不是#

  3. #{}的参数替换发生在数据库管理系统DBMS中,而${}发生在动态解析过程中

    编译时
    #{}使用?在编译的SQL语句中进行占位
    ${}将参数拼接直接替换进编译的SQL语句

  4. mysql中存在隐式转换,若查询字符串使用${}进行拼接,会造成转义,导致索引失效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值