zoukankan      html  css  js  c++  java
  • MyBatis之#{} and ${}

    #{} 和 ${} 之间最大的差别就是  #{}会在使用的时候被加上 ‘’ 引号, ${}直接传值,不做任何处理

    1.#{}对传入的参数会做预编译,也就是会当做字符串来处理  

    select * from info where name =  #{name}
    比如传递 博客园,得到的结果就是如下
    select * from info where name = '博客园'

    2.${}对传入的参数不会做任何的处理,也就是说传递什么就是什么

    select * from info where name = ${name]
    比如传递  博客园  得到的结果就是如下
    select * from info where name = 博客园

    3.#{} 最大的好处就是可以很大程度上防止SQL注入(SQL Injection),然而${}则不具备这样的功能

    比如我们在做用户登录的场景
    使用#{}
    select * from user where userCode = #{userCode} and userPwd = #{userPwd}
    前台传递:userCode = 123     userPwd = 123 or 1 = 1
    后台解析后,MyBatis首先会对SQL语句的参数用 ‘?’做预编译处理
    select * from user where userCode = ? and  userPwd = ?;
    最终效果:
    select * from user where userCode = '123' and userPwd = '123 or 1 = 1';
    这样就可以有效的防止了sql的注入效果
    
    使用${}
    select * from user where userCode = ${userCode} and userPwd = ${userPwd}
    前台传递:userCode = 123     userPwd = 123 or 1 = 1
    后台解析后,MyBatis会直接把值传递给sql,不做任何的处理!
    最终效果:
    select * from user where userCode = 123 and userPwd = 123 or 1 = 1;
    不仅可能导致语法错误!而且更严重的会对导致用户恶意注入sql获取信息,或者做其它恶意操作!!非常危险!

    4.说了这么多#{}的好处,好像${}被遗弃的婴儿一样(委屈),但是${}也是有很大作用的!如下:

    比如我们在直接想用SQL语句插入一条原封不动的参数的时候,如order by我们的${}就派上用场了()
    select * from info order by ${name}

    重点:SQL注入是非常可怕的!!!(搞不好被罚工资或者直接牢底坐穿)!一定要注意使用场景!

  • 相关阅读:
    静态路由
    ARP攻击原理及解决方法
    JS post提交表单
    ARP攻击
    三层交换机与路由器的比较
    动态域名解析软件——花生壳(peanuthull)
    DateTime.Now.Ticks 属性
    我的WCF之旅(1):创建一个简单的WCF程序
    window程序或服务的工作原理
    内网外网同时上的方法静态路由
  • 原文地址:https://www.cnblogs.com/arebirth/p/mybatisbyvalue.html
Copyright © 2011-2022 走看看