sql注入风险及mybatis#{}和${}区别(面试重点)

0 阅读1分钟

sql注入风险--如果利用 asd'or'1'='1 登录都会显示登录成功,因为后面有个条件 or 1=1成立


String sql = "select * from student where `name` = '" + name + "' and `password` ='" + password + "'";

这样会导致即使密码错误,也会登陆成功,以下是利用占位符去避免这种情况

String sql="select * from student where name=? and password=?";

# mybatis中#{}和${}的区别

  1. #{}:预编译,参数占位符
  2. ${}:字符串拼接,直接替换

核心区别

SQL注入

  1. #{}:安全,防Sql注入
  2. ${}:不安全,会被注入

处理方式

  1. #{}:变成?预编译,JDBC预处理
  2. ${}:不会加引号,传字符串要手动加,例:
where name =‘${name}

一句话总结

  • #{}:是预编译参数,安全,推荐使用
  • ${}:是字符串替换,不安全,只用于动态表明/列名