在mybatis中#{}和${}的区别,使用场景及sql注入

转载:https://blog.csdn.net/ideality_hunter/article/details/80623526

https://blog.csdn.net/weixin_42323802/article/details/82425111

2018年09月05日 15:47:53 打豆豆。 阅读数:1061 标签: #{}和${} #{} ${}  更多

个人分类: mybatis

版权声明:本站所提供的文章资讯、软件资源、素材源码等内容均为本作者提供、网友推荐、互联网整理而来(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考,如有侵犯您的版权,请联系我,本作者将在三个工作日内改正。 https://blog.csdn.net/weixin_42323802/article/details/82425111

在mybatis的  mapper.xml中,首先说下使用场景:

#{ }  :#代表占位符,用来传递参数;

${ }  :$用来拼接sql 语句的;譬如:把数据库中的表名作为参数拼接在 sql 语句中,必须使用 $

 mapper接口;

 
  1. //@Param 注解的作用如下

  2. //mapper接口中 ,给String tableName参数 起个名字叫tableName1

  3. // 这样mapper.xml 中 #{tableName1} 和${tableName1}可以拿到参数 tableName 的值

  4. public List<User> findUserByTableName(@Param("tableName1") String tableName);

 mapper.xml 配置文件中添加 sql 语句;

 
  1. <select id="findUserByTableName" resultType="User">

  2. <!--SELECT * from #{tableName1} 运行会报错,编译后sql语句中含有引号,sql语句错误-->

  3. SELECT * from ${tableName1}

  4. </select>


#{ }和${ }  区别如下:

1、#是预编译的方式,$是直接拼接;

2、#不需要关注数据类型,mybatis实现自动数据类型转换;$不做数据类型转换,需要自行判断数据类型;

3、#可以防止sql注入;$不能防止sql注入;

4、如果 parameterType 只有一个参数,默认情况下,#{ }中可以写任意的名字;${ }中只能用value来接收。

 
  1. <!-- #{}代表占位符?,表示mybatis框架会接收输入的参数并赋值到sql语句当中

  2. 关于简单类型(int,String,date。long)可以使用value来代表参数名

  3.  
  4. -->

  5.  
  6. <select id="findUserById" parameterType="java.lang.Integer" resultType="model.User">

  7. select * from user where id=#{id}

  8. </select>

  9. <!--模糊查询 like +条件 '% ${匹配的内容} %' $是-->

  10. <select id="findUserByName" parameterType="String" resultType="model.User">

  11. select * from user where name like '%${value}%';

sql注入,一个例子让你知道什么是sql注入

2018年06月08日 17:10:14 Ideality_hunter 阅读数:12469

 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ideality_hunter/article/details/80623526

sql注入,一个例子让你知道什么是sql注入

这篇文章说的非常好

https://www.cnblogs.com/sdya/p/4568548.html

我就是按照文中例子,亲自在我之前用final框架做的项目中,操作了一遍,的确是实现了用户登录。

在不知道用户名和密码的情况下实现了用户登录

重现sql注入过程如下:

1、在用户名输入' or 1=1 --,然后随便输入一个密码

2、点击登录,我竟然登录进去系统了。

为什么呢?

debug一下源代码,就不难知道原因。

点击登录,得到的sql语句是:

select * from AUTH_USER t where t.LOG_IN_NAME='' or 1=1 --' and  t.PASSWORD='gdd'

放入oracle去执行:

返回了所有的用户信息,这样authUser就肯定不是null了,表示数据库有相关用户,当然就算是登录成功了。

果不其然成功进入了系统界面,这样用户就算是登录了,虽然是一个随机的一个用户,但是该用户的操作他都可以干,甚至如果知道框架的action地址,那么在浏览器中输入功能的action的地址,他想干什么就干什么了。

猜你喜欢

转载自blog.csdn.net/akunshouyoudou/article/details/88429437
今日推荐