• Mybatis---使用#{ }与${ }有什么区别?


      动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${};两者都是动态的向sql语句中传入需要的参数。

    #{}会在预编译期生成?,作为占位符。$ {}是直接拼接字符串。

    #{}可以防止SQL注入的风险(语句的拼接);但${}无法防止Sql注入

    预编译的机制。预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。

    我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。

    使用#{ },会将{ }里面的传入的值自动解析成为带引号的值

    select count(1)  from tb_user where username = #{username} and  password  = #{password}

    此时传入username传入的值为admin,password传入的值为123456,那么最后的sql就是:

    select count(1) from tb_user where username = 'admin' and password  = '123456';

    #{}会解析成字符串,而${}就会这样解析:

    select count(1) from t_user where username = admin and password  = 123456;

    显然,这是一个错误的sql语句,大多数情况下还是经常使用#,一般能用#的就别用$;但有些情况下必须使用$,例:MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。

    什么是SQL注入?

    SQL注入就是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作

    比如说,在登录过程中,利用上面的语句到数据库中查找用户名/密码是否存在,如果存在就登录成功

    而如果不存在就登录失败,如果说你后台使用的是${},恶意用户在表单中的用户名文本框中输入的是'admin'

    密码框中输入的是' ' or 1 = 1 加了一引号和一个恒成立的条件,那么,传到数据库中的sql就是:

    select count(1) from t_user where user_name = 'admin' and user_password = ' ' or 1=1

    如果程序没有做其他的校验,此时,该恶意用户是可以登录系统的! 这就是SQL注入,恶意攻击

    而如果使用#{}是不会出现这种情况的,#{}默认会给输入的值加上引号,但是使用#{}在其他场景下并不适用

    比如要使用到排序 order by #{} 传入的参数应是表对应字段名,但是加上引号后就会解析成

    order by 'age' 这样就达不到排序的目的,而此时如果使用${}就可以达到排序的目的

    即,sql解析成 order by age,根据age排序

    我话讲完!谁赞成?谁反对?
  • 相关阅读:
    IOS系统下虚拟键盘遮挡文本框问题的解决
    ubuntu git的安装更新及配置
    js 画布与图片的相互转化(canvas与img)
    js 图片与base64互相转换
    PHP base64数据与图片的互相转换
    js 判断当前操作系统是ios还是android还是电脑端
    ubuntu下nodejs和npm的安装及升级
    vue中使用html2canvas及解决html2canvas截屏图片模糊问题
    vue文件中引入外部js
    php 执行 命令行命令
  • 原文地址:https://www.cnblogs.com/wffzk/p/12781226.html
Copyright © 2020-2023  润新知