温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java mybatis如何防止注入

发布时间:2026-09-23 06:37:30 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

Java + MyBatis 中,防止 SQL 注入的核心原则是:永远不要拼接 SQL,使用参数绑定(PreparedStatement)。下面按常见场景说明。


一、最推荐:使用 #{}(预编译参数)

1️⃣ XML Mapper 中

<select id="getUser" resultType="User">
    SELECT * FROM user
    WHERE username = #{username}
</select>

✅ MyBatis 会生成:

SELECT * FROM user WHERE username = ?

✅ 参数通过 PreparedStatement 传入,可防注入


2️⃣ 注解方式

@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("非法字段");
}

三、动态 SQL 中的防注入写法

✅ 正确(#{})

<if test="username != null">
    AND username = #{username}
</if>

❌ 错误(拼接)

AND username = '${username}'

四、IN 查询防注入

✅ 正确方式

<select id="listByIds">
    SELECT * FROM user
    WHERE id IN
    <foreach collection="ids" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</select>

五、Like 查询防注入

✅ 推荐(Java 中拼接 %)

String keyword = "%" + name + "%";
WHERE username LIKE #{keyword}

❌ 不推荐

WHERE username LIKE '%${name}%'

六、其他安全建议

✅ 使用 MyBatis 官方版本
✅ 不信任任何前端参数
✅ 结合:

  • 参数校验(Hibernate Validator)
  • 最小权限数据库账号
  • 关闭错误回显

总结一句话

MyBatis 防注入 = 只用 #{},不用 ${},必要时白名单校验

如果你有 具体代码场景(XML / 注解 / 动态 SQL),我可以帮你逐行检查。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI