【Mybatis面试题】Mybatis如何防止SQL注入?$#的区别是什么

1. 如何防止SQL注入?

SQL注入:SQL命令插入到web表单提交或通过页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL指令。注入攻击的本质是把用户输入的数据当做代码执行。例如:

例如: 表单有两个用户需要填写的表单数据,用户名和密码,如果用户输入admin(用户名)111(密码),
若数据库中存在此用户则登录成功。SQL大概是这样
SELECT * FROM XXX WHERE userName = admin and password = 111
遭到了SQL注入,输入的数据变为  admin or 1 =1 # 密码随便输入,这时候就直接登录了,SQL大概是这样:
SELECT * FROM XXX WHERE userName = admin or 1 = 1 # and password = 111,
因为 # 在sql语句中是注释,将后面密码的验证去掉了,而前面的条件中1 = 1始终成立,所以不管密码正确
与否,都能登录成功

SQL注入解决方案:服务器使用#{}完成SQL的拼写。

2. $#的区别是什么?

#{}实现原理: 在Mybatis中的底层是运用了PreparedStatement 预编译,即参数化查询。传入的参数会以? 形式显示, 将带有占位符 ? 的SQL模板发送至MySQL服务器,由服务器对无参数的SQL进行编译后,将编译结果缓存,下次直接使用传入的参数即可。预编译的优点

  1. 提高执行的效率:预编译将SQL语句和参数分离开来,将SQL语句编译成一个执行计划,参数只需要传递即可,不需要每次使用这个SQL语句的时候都要重新进行编译,减少了执行时间和资源的消耗,减少了数据库的负载;
  2. 提高安全性,防止SQL注入
  3. 预编译语句可以重复利用。放到缓存中,可以重复利用。

${}的实现原理:${}仅仅为一个字符串替换,它将占位符替换成一个文本字符串,然后生成SQL语句,在每次执行SQL的时候都会重新进行编译,有SQL注入的问题。

总的来说,推荐在 MyBatis 中使用#{} 符号来传递参数值,以确保安全性和避免 SQL 注入问题。而 ${} 则更适合用于动态拼接 SQL 语句的非值部分,如列名、表名等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桃花猿

客官,赏点打酒钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值