温馨提示×

温馨提示×

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

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

java mybatis怎么防止sql注入

发布时间:2026-09-02 17:53:14 来源:亿速云 阅读:86 作者:小樊 栏目:编程语言

Java + MyBatis 中防止 SQL 注入,核心原则是:
永远不要拼接 SQL 字符串,使用参数绑定(PreparedStatement)

下面按常见场景说明 ✅


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

1️⃣ Mapper XML 中

<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 注入


2️⃣ 注解方式

@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

${} 只能用于:

  • 表名
  • 字段名
  • 排序字段(ORDER BY)
  • 动态 SQL 片段

✅ 且必须 白名单控制

if (!"id".equals(sort) && !"name".equals(sort)) {
    sort = "id";
}
ORDER BY ${sort}

三、防止 SQL 注入的“铁律”

✅ 正确做法

  • 使用 #{}
  • 使用 MyBatis 动态 SQL(<if> <where>
  • 排序/表名使用白名单校验

❌ 错误做法

  • 字符串拼接 SQL
  • 使用 ${} 传用户输入
  • 前端参数直接进 SQL

四、示例对比

❌ 错误(注入风险)

String sql = "SELECT * FROM user WHERE name = '" + name + "'";

✅ 正确(MyBatis)

WHERE name = #{name}

五、额外安全建议

  1. 最小权限数据库账号
  2. 关闭不必要的 SQL 功能
  3. 敏感操作加日志审计
  4. 输入校验(长度、类型、正则)

总结一句话 ✅

MyBatis 防 SQL 注入 = 用 #{} + 不拼 SQL + ${} 白名单

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

向AI问一下细节

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

AI