Mybatis——#和$的区别
简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${};两者都是动态的向sql语句中传入需要的参数。
#的使用
#通常用于替换SQL语句中的占位符,并将参数值安全地传递给数据库。
使用#时,MyBatis会将参数值作为预编译参数传递给数据库,并将参数值进行自动转义和处理,以防止SQL注入攻击。
示例:SELECT * FROM users WHERE id = #{userId}。
为什么#{}能防止SQL注入:
使用#{}可以防止SQL注入攻击,因为MyBatis会在替换占位符之前对参数值进行自动处理和转义。这意味着参数值中的特殊字符(例如单引号、分号等)会被转义,从而不会破坏SQL语句的结构。具体的处理取决于数据库驱动程序的特性和配置,但通常会包括字符转义和参数类型匹配。
转义字符表——
| 转义符号 | 字符 | 备注 |
|---|---|---|
< |
< | 小于号 |
> |
> | 大于号 |
& |
& | 和 |
' |
’ | 单引号 |
" |
" | 双引号 |
$的使用
\(用于直接将参数值嵌入SQL语句中,不会进行预编译或参数处理。
使用\)时,参数值会直接替换SQL语句中的占位符,这可能导致SQL注入攻击,因为参数值没有经过安全处理。
示例:SELECT * FROM users WHERE id = ${userId}。
SQL注入
SQL注入是一种安全漏洞,通常发生在Web应用程序中,攻击者试图通过在输入中注入恶意SQL代码来执行未经授权的数据库操作。这种攻击的目标是绕过应用程序的输入验证,以执行恶意SQL查询、修改、删除或访问敏感数据。
e.g.,攻击者在输入中输入userId为1 OR 1=1,则SQL语句会变成:
SELECT * FROM users WHERE id = 1 OR 1=1
这将导致查询返回所有用户的数据,因为1=1始终为真。这就是典型的SQL注入攻击,攻击者成功地改变了SQL查询的行为。
因此,为了防止SQL注入攻击,建议使用#{}语法,这样MyBatis会安全地处理参数值,而不会将其直接插入SQL语句中。这是一种最佳实践,以增加应用程序的安全性。

浙公网安备 33010602011771号