在 Java + MyBatis 中,防止 SQL 注入的核心原则是:永远不要拼接 SQL,使用参数绑定(PreparedStatement)。下面按常见场景说明。
#{}(预编译参数)<select id="getUser" resultType="User">
SELECT * FROM user
WHERE username = #{username}
</select>
✅ MyBatis 会生成:
SELECT * FROM user WHERE username = ?
✅ 参数通过 PreparedStatement 传入,可防注入
@Select("SELECT * FROM user WHERE username = #{username}")
User getUser(@Param("username") String username);
${} 是危险来源(不能防注入)<select id="orderBy">
SELECT * FROM user ORDER BY ${column}
</select>
❌ 直接拼接 SQL
❌ 用户可控 → SQL 注入
${}(如排序字段)✅ 做法:白名单校验
if (!"id".equals(column) && !"name".equals(column)) {
throw new IllegalArgumentException("非法字段");
}
<if test="username != null">
AND username = #{username}
</if>
AND username = '${username}'
<select id="listByIds">
SELECT * FROM user
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
String keyword = "%" + name + "%";
WHERE username LIKE #{keyword}
WHERE username LIKE '%${name}%'
✅ 使用 MyBatis 官方版本
✅ 不信任任何前端参数
✅ 结合:
MyBatis 防注入 = 只用
#{},不用${},必要时白名单校验
如果你有 具体代码场景(XML / 注解 / 动态 SQL),我可以帮你逐行检查。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。