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语句的结构。具体的处理取决于数据库驱动程序的特性和配置,但通常会包括字符转义和参数类型匹配。

转义字符表——

转义符号 字符 备注
&lt; < 小于号
&gt; > 大于号
&amp; &
&apos; 单引号
&quot; " 双引号

$的使用

\(用于直接将参数值嵌入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语句中。这是一种最佳实践,以增加应用程序的安全性。

posted @ 2023-10-08 16:20  岸南  阅读(216)  评论(0)    收藏  举报