Skip to content

#{} 和 ${}的区别

更新: 2025/12/6 字数: 0 字 时长: 0 分钟

#{}会预编译,MyBatis将其替换成?,也会自动进行类型处理,不需要手动添加引号,可以有效防止SQL注入(使用场景:参数值的传递,例如WHERE、INSERT等)

参数值会安全地传递给 ?,即使传入恶意参数如 ' OR '1'='1,也只会被当作一个普通的字符串值,不会破坏SQL结构。

${}直接字符串替换,纯粹的字符串拼接,存在SQL注入风险,(使用场景:动态SQL部分,例如表名、列名等)

xml
<!-- 使用 ${} 的危险写法 -->
<select id="login" resultType="User">
    SELECT * FROM user 
    WHERE username = '${username}' AND password = '${password}'
</select>

-- 在SQL中是注释,后面的条件被注释掉了,攻击者就能以admin身份登录,最后得到的结果是:

sql
SELECT * FROM user 
WHERE username = 'admin' -- ' AND password = '任意密码'
本站访客数 人次 本站总访问量