在 Java + MyBatis 中防止 SQL 注入,核心原则是:
永远不要拼接 SQL 字符串,使用参数绑定(PreparedStatement)。
下面按常见场景说明 ✅
#{}(预编译参数)<select id="getUser" parameterType="map" resultType="User">
SELECT * FROM user
WHERE username = #{username}
AND age = #{age}
</select>
✅ MyBatis 会生成:
SELECT * FROM user WHERE username = ? AND age = ?
参数通过 PreparedStatement 传入,天然防止 SQL 注入。
@Select("SELECT * FROM user WHERE username = #{username}")
User getUser(@Param("username") String username);
✅ 同样安全
${}<select id="getUser" resultType="User">
SELECT * FROM user
WHERE username = '${username}'
</select>
❌ 会直接拼接字符串,极易 SQL 注入:
' OR '1'='1
${} 只能用于:✅ 且必须 白名单控制
if (!"id".equals(sort) && !"name".equals(sort)) {
sort = "id";
}
ORDER BY ${sort}
#{}<if> <where>)${} 传用户输入String sql = "SELECT * FROM user WHERE name = '" + name + "'";
WHERE name = #{name}
MyBatis 防 SQL 注入 = 用
#{}+ 不拼 SQL +${}白名单
如果你有具体代码(XML / 注解 / 动态 SQL),我可以帮你逐行检查是否安全。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。