-
mybatis可以通过# $ 进程sql拼接 拼接后的sql其实并没有什么不同
-
但在预编译阶段 #{} ${} 的处理是不同的
-
#{} 在预编译阶段会处理成一个占位符 ${} 只是简单的字符串拼接
-
#{} 的参数替换是发生在 DBMS 中,而 ${} 则发生在动态解析过程中
-
所以 &{}会产生sql注入的问题
-
什么是DBMS
DBMS 是“数据库管理系统”的简称(全称 DataBase Management System)。
实际上它可以对多个数据库进行管理,所以你可以理解为 DBMS = 多个数据库(DB) + 管理程序。
所以大家可以想到虽然我们有时候把 Oracle、MySQL 等称之为数据库,
但确切讲,它们应该是数据库管理系统,即 DBMS。
- 什么是sql注入
select * from ${tableName} where name = #{name}
在这个例子中,如果表名为
user; delete user; –
则动态解析之后 sql 如下:
select * from user; delete user; -- where name = ?;
–之后的语句被注释掉,而原本查询用户的语句变成了查询所有用户信息+删除用户表的语句,
会对数据库造成重大损伤,极大可能导致服务器宕机。