MyBatis框架下防止SQL注入

2023-05-16

与传统的ORM框架不同,MyBatis使用XML描述符将对象映射到SQL语句或者存储过程中,这种机制可以让我们更大的灵活度通过SQL来操作数据库对象,因此,我们必须小心这种便利下SQL注入的可能性。

安全用法

<select id="getPerson" parameterType="int" resultType="org.application.vo.Person">
SELECT * FROM PERSON WHERE ID = #{id}
</select>

这是我们推荐的一种用法,注意参数符号#{id},使用#{}语法,MyBatis会通过预编译机制生成PreparedStatement参数,然后在安全的给参数进行赋值操作,因此就避免了SQL注入:

/* Comparable JDBC code */
String selectPerson = "SELECT * FROM PERSON WHERE ID = ?"; 
PreparedStatement ps = conn.prepareStatement(selectPerson); 
ps.setInt(1, id);

更多安全用法示例:

<insert id="insertPerson" parameterType="org.application.vo.Person">
insert into Person (id, name, email, phone)
values (#{id}, #{name}, #{email}, #{phone})
</insert>
 
<update id="updatePerson" parameterType="org.application.vo.Person">
update Person set name = #{name}, email = #{email}, phone = #{phone}
where id = #{id}
</update>
 
 
<delete id="deletePerson" parameterType="int">
delete from Person where id = #{id}
</delete>

不安全用法

<select id="getPerson" parameterType="string" resultType="org.application.vo.Person">
SELECT * FROM PERSON WHERE NAME = #{name} AND PHONE LIKE '${phone}'; 
</select>

首先,这是一种不全的用法,注意上面的参数修符号${phone} ,使用${}参数占位修饰符,MyBatis不会对字符串做任何修改,而是直接插入到SQL语句中。这也就是说MyBatis在对参数进行替换操作时,不会对参数值进行任何修改或者转义操作。

假设,电话号码phone参数由用户进行输入,系统本身未对输入值进行任何校验或者转义,那么潜在攻击者可能通过输入类似:"1%' OR '1'='1"这样的电话号码值,那么用户查询语句就会变成下面的格式:

SELECT * FROM PERSON WHERE NAME = ? and PHONE LIKE '1%' OR '1' = '1'

另外,如果电话号码是这样的值:A%'; DELETE FROM PERSON; --,脚本执行的结果可能就是删除 PERSON 表中的所有记录:

SELECT * FROM PERSON WHERE NAME = ? and PHONE LIKE 'A%'; DELETE FROM PERSON; --'

像上面这种用法,后台直接接收用户输入,而不对输入进行任何校验都是非常危险的,这可能带来潜在的SQL注入攻击,因此,当我们在使用${}语法时,接受参数应不允许用户输入,或者允许用户输入,系统必须对用户输入进行必要的校验和转义。

下面是一些不安全的用法示例

<insert id="insertPerson" parameterType="org.application.vo.Person">
insert into Person (id, name, email, phone)
values (#{id}, #{name}, #{email}, ${phone})
</insert>
 
<update id="updatePerson" parameterType="org.application.vo.Person">
update Person set phone = ${phone}
where id = #{id}
</update>
 
 
<delete id="deletePerson" parameterType="int">
delete from Person where id = ${id}
</delete>

原文链接:
https://software-security.sans.org/developer-how-to/fix-sql-injection-in-java-mybatis

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis框架下防止SQL注入 的相关文章

随机推荐

  • Java异常处理的九个最佳实践

    1 确保在Finally程序块中完成资源释放或者使用Try With语句 比如对于InputStream xff0c 当我们使用完毕 xff0c 我们要确保资源被正确关闭 xff0c 比如下面我们常见的错误用法 xff0c 不要在try模块
  • CodeMirror使用笔记

    最近因工作需要 xff0c 在项目中使用了CodeMirror代码编辑器 xff0c 以下是使用笔记 首先 xff0c 看下最终的效果 引入基本的需要资源 lt script src 61 34 lt 61 request getConte
  • JAVA注解

    Java注解Annotations主要用于为目标程序提供额外补充的说明信息 注解以 64 符号标识注解并不改变编译程序的行为注意可以为程序元素 xff1a 实例变量 构造方法 方法或者类添加元数据信息注解并不是单纯的注释 xff0c 但却可
  • ubuntu中GitLab的安装与配置

    这里 xff0c 我们采用离线安装的方式安装GitLab 首先 xff0c 我们从清华大学开源软件镜像站中下载软件包 xff0c 用户可根据实际的服务器操作系统版本来选择不同的镜像资源 xff0c 这里我们以ubuntu为例 执行命令sud
  • Jenkins使用笔记

    本章简单记录Jenkins的使用笔记 首先 xff0c 我们从官网中下载安装介质 xff0c 可以看到这里有适合各种操作系统版本的安装源介质 xff0c 简单起见 xff0c 我们直接下载一个通用的war程序包 执行命令java jar j
  • GitLab 与 Jenkins 持续集成实践

    首先 xff0c 我们简单说明下我们的部署环境 xff1a GitLab xff1a 192 168 43 61 Jenkins xff1a 192 168 43 116 Jenkins中系统设置中 xff0c 配置GitLab连接信息 x
  • Linux下免密认证登录失败原因总结

    事件背景 A机器已经生产rsa密钥且已经将public key添加到B机器 root ssh authorized keys xff0c 但是从A机器上ssh root 64 B机器时仍然需要输入密码 xff0c 即无密码认证失败 原因总结
  • 公钥添加到authorized_keys到文件中之后仍无法免密登陆

    接上一章 xff0c 关于Linux下免密登陆失败 xff0c 这里找了Stackoverflow上关于这个问题的讨论 xff1a Adding public key to ssh authorized keys does not log
  • Java 8 中的List排序

    按字母顺序排序字符串列表 List lt String gt cities 61 Arrays asList 34 Milan 34 34 london 34 34 San Francisco 34 34 Tokyo 34 34 New D
  • Microservices vs SOA - 微服务与SOA

    开始之前 xff0c 我们先简单看下单体架构 SOA与微服务之间的区别 xff0c 如下图所示 xff1a 简单来讲 xff0c 对于单体架构 xff0c 其就像一个超大容器 xff0c 容器内集中包含了该应用的所有软件组件 xff0c 并
  • Python 机器学习8:sklearn 聚类算法

    1 K Means算法是一种广泛使用的聚类算法 from sklearn cluster import KMeans K Means是聚焦于相似的无监督的算法 xff0c 以距离作为数据对象间相似性度量的标准 xff0c 即数据对象间的距离
  • 什么是微服务——微服务架构体系介绍

    Why Microservices 回答这个问题前 xff0c 我们先看下之前大行其道的单体架构 Monolithic Architecture xff0c 对于非专业人士来讲 xff0c 所谓的单体架构 xff0c 其就像一个超大容器 x
  • 微服务架构特征

    一个典型的微服务架构 xff08 MSA xff09 通常包含以下组件 xff1a 客户端 xff1a 微服务架构着眼于识别各种不同的类型的设备 xff0c 以及在此设备上进行的各种管理操作 xff1a 搜索 构建 配置等等身份标识提供者
  • 微服务架构系列——API服务网关

    本章我们简单介绍微服务架构下的API服务网关 xff0c 本章我们将讨论以下话题 xff1a 什么是API服务网关为什么需要API服务网关API服务网关的工作机制 处理横切关注点 当我们在开发设计大型软件应用时 xff0c 我们一般都会采用
  • Java之keytool命令学习

    Java Keytool is a key and certificate management utility It allows users to manage their own public private key pairs an
  • HashMap 与 HashTable的区别

    HashMap 实现了Map接口非线程同步 xff0c 非线程安全不允许重复键键和值均允许为null HashMap lt Interger String gt employeeHashmap 61 new HashMap lt Integ
  • 如何避免敏捷失败?

    很多人都听说敏捷 xff0c 有些人知道敏捷是什么 xff0c 有些人也尝试过敏捷 xff0c 本章中将列举出一些常见的错误敏捷实践 xff0c 如果想要避免敏捷失败 xff0c 建议还是要对照下你所在的敏捷团队中有没有类似的敏捷实践 xf
  • 一个人有文化,到底有多重要?

    关于什么是文化 xff0c 我最最欣赏的回答 xff0c 是作家梁晓声的四句概括 xff1a 根植于内心的修养 xff0c 无需提醒的自觉 xff0c 以约束为前提的自由 xff0c 为别人着想的善良 01 一位叫做 Judy 的空姐 xf
  • MyBatis动态SQL中Map参数处理

    在MyBatis中 xff0c 如果我们需要传递两个参数 xff0c 有一种方式是通过Map作为传入参数 xff0c 在动态SQL中 xff0c 我们需要对传入的Map参数中的值进行判断 xff0c 然后进行动态SQL的条件拼接处理 假设我
  • MyBatis框架下防止SQL注入

    与传统的ORM框架不同 xff0c MyBatis使用XML描述符将对象映射到SQL语句或者存储过程中 xff0c 这种机制可以让我们更大的灵活度通过SQL来操作数据库对象 xff0c 因此 xff0c 我们必须小心这种便利下SQL注入的可