使用 # 占位符,而不是 $ 占位符来避免 SQL 注入攻击
在 MyBatis 等框架中,常见的两种占位符形式为 #{} 和 ${}。两者的差别主要在于它们处理传入参数的方式,从而直接影响了 SQL 注入风险。以下是详细说明:
1. 占位符工作机制
#{}占位符
比如,在 MyBatis 中,使用#{}占位符来代替直接拼接 SQL 语句,MyBatis 会自动进行参数化处理。
<select id="selectUser" resultType="User">
SELECT * FROM users WHERE username = #{userName}
</select>
假如 userName 传入的值是 9;DROP TABLE SYS_USER;,传入的删除表 SQL 也不会执行,因为它会被当作参数值
SELECT * FROM users WHERE username = '9;DROP TABLE SYS_USER;'
${}占位符
${}占位符则采用字符串替换机制,其工作方式如下:- 直接拼接字符串:当使用
${param}时,MyBatis 会直接将传入的参数值嵌入到 SQL 语句中,就像使用字符串拼接一样。 - 引入风险:这种直接拼接不经过预编译和参数绑定,导致如果传入的值中包含恶意的 SQL 代码,就有可能被执行,从而产生 SQL 注入漏洞。
- 直接拼接字符串:当使用
。

浙公网安备 33010602011771号