广告
返回顶部
首页 > 资讯 > 精选 >Mybatis的SQL注入实例分析
  • 190
分享到

Mybatis的SQL注入实例分析

2023-06-29 04:06:21 190人浏览 八月长安
摘要

本文小编为大家详细介绍“mybatis的sql注入实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis的SQL注入实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言MyBatis3提供了

本文小编为大家详细介绍“mybatissql注入实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis的SQL注入实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    前言

    MyBatis3提供了新的基于注解的配置。主要在MapperAnnotationBuilder中,定义了相关的注解:

    public MapperAnnotationBuilder(Configuration configuration, Class<?> type) {    ...    sqlAnnotationTypes.add(Select.class);    sqlAnnotationTypes.add(Insert.class);    sqlAnnotationTypes.add(Update.class);    sqlAnnotationTypes.add(Delete.class);    ......    sqlProviderAnnotationTypes.add(SelectProvider.class);    sqlProviderAnnotationTypes.add(InsertProvider.class);    sqlProviderAnnotationTypes.add(UpdateProvider.class);    sqlProviderAnnotationTypes.add(DeleteProvider.class);}

    增删改查占据了绝大部分的业务操作,通过注解不在需要配置繁杂的xml文件,越来越多的sql交互均通过注解来实现。从MapperAnnotationBuilder可以看到Mybatis提供了以下相关的注解:

    • @Select

    • @Insert

    • @Update

    • @Delete

    • @SelectProvider

    • @InsertProvider

    • @UpdateProvider

    • @DeleteProvider

    例如如下例子,使用@Select注解直接编写SQL完成数据查询:

    @Mapperpublic interface UserMapper {    @Select("select * from t_user")    List<User> list();}

    使用类似@SelectProvider高级注解可以指定某个工具类的方法来动态编写SQL,以应对复杂的业务需求。
    以@SelectProvider 为例,查看具体的实现,主要包含两个注解属性,其中type表示工具类,method 表示工具类的某个方法,用于返回具体的SQL:

    @Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface InsertProvider {    // 用于指定获取 sql 语句的指定类    Class<?> type();    // 指定类中要执行获取 sql 语句的方法    String method();}

    使用方法如下,在ProjectSql类的getContentByProjectIds方法定义相关的sql即可,sql的定义可以通过org.apache.ibatis.jdbc.SQL来快速实现:
    @SelectProvider(type = ProjectSql.class, method = "getContentByProjectIds")
    List<Integer> getContentByProjectIds(List<Integer> projectIds);

    常见注入场景

    2.1普通注解

    实际上跟xml配置中对应的标签语法是一样的(例如@Select对应<select>标签),所以注入场景也是类似的。

    在Mybatis中,#的作用主要是替换预编译语句(PrepareStatement)中的占位符?,$是直接的SQL拼接。以like模糊查询 为例子:

    例如如下例子:

    跟xml配置一样,like模糊查询直接使用#预编译的方式进行注解的话会触发异常,所以很多时候直接使用$进行注解:

    @Select("SELECT id, name, age, email FROM user where name like '${name}'")List<User> queryUserByName(@Param("name") String name);

    那么此时name前端用户可控的话,将导致SQL注入风险。

    图片查看sql日志,成功执行1/0触发sql error,说明注入成功:

    处理这类SQL问题也很简单,使用sql的内置函数进行拼接,拼接后再采用#预编译的方式进行查询。例如上面案例是h3数据库的,使用'||'拼接再进行预编译处理即可:

    @Select("SELECT id, name, age, email FROM user where name like '%'||#{name}||'%'")List<User> queryUserByName(@Param("name") String name);

    此时已使用预编译进行SQL查询:

    此外,类似Order by、动态表名,无法采用预编译的方式情况,可以在在代码层使用间接引用的方式进行处理。

    对于范围查询in,熟悉mybatis注入的话,是需要使用MyBatis自带的循环指令foreach来解决SQL语句动态拼接的,当使用注解时,就需要使用< script>标签来引入foreach了。

    2.2 动态sql

    2.2.1 使用< script>

    要在带普通注解的映射器接口类中使用动态 SQL,可以使用script 元素。跟xml类似,主要是如下的元素:

    ifchoose (when, otherwise)trim (where, set)foreach

    相关的注入场景跟2.1也是类似的。也是离不开$。此外,在进行同条件多值查询(例如范围查询in)的时候,可以使用MyBatis自带的循环指令foreach来解决SQL语句动态拼接的问题。

    2.2.2 使用Provider注解

    可以通过使用Provider注解指定某个工具类的方法来动态编写SQL。以@SelectProvider为例:

    首先在mapper中使用@SelectProvider定义相关的方法,其中type表示工具类,method 表示工具类的某个方法,用于返回具体的SQL。例如下面的例子:
    通过传递userIds以及name,查询相关的用户信息,在UserInfoSql类的getUserInfoByids方法定义了具体的SQL内容:

      @SelectProvider(type = UserInfoSql.class, method = "getUserInfoByids")  List<User> getUserInfoByids(List<Long> userIds, String name);     class UserInfoSql {    public String getUserInfoByids(List<Long> userIds, String name) {      SQL sql = new SQL();      sql.SELECT("id, name, age, email");      sql.FROM("user");      sql.WHERE("id in(" + Joiner.on(',').join(userIds) + ")");      if(StringUtil.isNotBlank(name)){        sql.WHERE("name like '%" + name + "%'");      }      sql.ORDER_BY("id desc");      return sql.toString();    }  }

    在Controller调用具体方法就可以进行sql查询了:

    @RequestMapping(value = "/getUserInfoByids") public List<User> getUserInfoByids(String name,@RequestParam List<Long> userIds){         List<User> userList = userMapper.getUserInfoByids(userIds,name);         return userList; }

    正常请求返回对应的用户信息:

    前面是通过MyBatis 3 提供的工具类org.apache.ibatis.jdbc.SQL来生成SQL的。该类提供了类似select、where、ORDER_BY等方法来完成SQL生成的操作。这里有个误区,很多开发认为这里工具类会进行相关的预编译处理。

    实际上Provider其实只需要返回一个SQL字符串,工具类只不过用了一些关键字做格式化而已,甚至可以直接使用StringBuffer拼接SQL语句。同样是上面的例子,List userIds是long类型,但是name是String类型,可以尝试注入:

    查看相关日志,成功执行1/0逻辑触发SQL error,也印证了Provider实际上只是 SQL 拼接,没有做相关的安全处理 :

    相比@Select@,SelectProvider 只是在定义注解的方式上有所不同, 前者是直接定义 sql, 一个是在外部定义好 sql 直接引用, 没本质上的区别,所以解决方法是在对应的sql场景,使用#进行预编译进行处理,例如这里的like模糊查询和in范围查询:

    @SelectProvider(type = UserInfoSql.class, method = "getUserInfoByids")  List<User> getUserInfoByids(@Param("userIds")List<Long> userIds,@Param("name")String name);     class UserInfoSql {    public String getUserInfoByids(@Param("userIds")List<Long> userIds, @Param("name")String name) {            StringBuilder sql = new StringBuilder(128);            sql.append("< script>SELECT id, name, age, email FROM user WHERE (id in");            sql.append("<foreach item='item' collection='userIds' open='(' separator=',' close=')'>#{item}</foreach>");      if(StringUtil.isNotBlank(name)){              sql.append("and name like '%'||#{name}||'%')");      }      sql.append("ORDER BY id desc</script>");      return sql.toString();    }  }

    查看sql日志,此时使用预编译进行sql处理,避免了SQL注入风险。

    读到这里,这篇“Mybatis的SQL注入实例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: Mybatis的SQL注入实例分析

    本文链接: https://www.lsjlt.com/news/322528.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Mybatis的SQL注入实例分析
      本文小编为大家详细介绍“Mybatis的SQL注入实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis的SQL注入实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言MyBatis3提供了...
      99+
      2023-06-29
    • Mybatis-Plus注入SQL原理分析
      目录前言案例测试原理解析前言 MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 那么 MyBat...
      99+
      2022-11-13
    • Mybatis防止sql注入的实例
      sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1'='1'”这样的语句,有可能入侵参数校验不足的应用程序。所以在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些...
      99+
      2023-05-31
      mybatis sql 注入
    • SQL注入的示例分析
      这篇文章主要为大家展示了“SQL注入的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL注入的示例分析”这篇文章吧。SQL注入攻击的总体思路 ...
      99+
      2022-10-18
    • Mybatis防止sql注入原理分析
      目录Mybatis防止sql注入原理底层实现原理Mybatis解决sql注入问题小结一下Mybatis防止sql注入原理 SQL 注入是一种代码注入技术,用于攻击数据驱动的应用,恶意...
      99+
      2022-11-12
    • sql注入之手工注入的示例分析
      这篇文章将为大家详细讲解有关sql注入之手工注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。为了方便说明,我们还是用之前的数字型的注入点为例来进行说明。得到字...
      99+
      2022-10-18
    • SQL报错注入的示例分析
      小编给大家分享一下SQL报错注入的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL报错注入概述通过构造特定的SQL语句,让攻击者想要查询的信息(如数据...
      99+
      2023-06-29
    • SQL注入绕过的示例分析
      这篇文章主要介绍了SQL注入绕过的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言sql注入在很早很早以前是很常见的一个漏洞。后来...
      99+
      2022-10-18
    • Mybatis常用注解中的SQL注入实例详解
      目录前言常见注入场景2.1普通注解2.2 动态sql2.2.1 使用< script>2.2.2 使用Provider注解总结前言 MyBatis3提供了新的基于注解的配...
      99+
      2022-11-13
    • Mybatis中SQL节点实例分析
      这篇文章主要讲解了“Mybatis中SQL节点实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatis中SQL节点实例分析”吧!一、文章引出原因某天在完成项目中的一个小功能后进行...
      99+
      2023-06-29
    • 实例讲解MyBatis如何防止SQL注入
       SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见。究其原因不外乎:No patch for stupid。为什么这么说,下面就以JAVA为例进行说明: 假设数据库中存在这样...
      99+
      2022-11-12
    • 数据库中sql注入的示例分析
      这篇文章将为大家详细讲解有关数据库中sql注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先可能大家都会问什么是sqlSql是数据库的一种类型,是用来存储网...
      99+
      2022-10-18
    • SQL注入漏洞过程的示例分析
      这篇文章将为大家详细讲解有关SQL注入漏洞过程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码示例:public class JDBCDe...
      99+
      2022-10-18
    • 数据库之SQL注入的示例分析
      小编给大家分享一下数据库之SQL注入的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、产生SQL注入原因开发代码的时候没有全面考虑到网络安全性,特别是在...
      99+
      2023-06-20
    • SQL Server中WAITFOR DELAY注入的示例分析
      这篇文章主要为大家展示了“SQL Server中WAITFOR DELAY注入的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL Server中WAITFOR DELAY注入的示例分...
      99+
      2023-06-04
    • sql注入之类型以及提交注入的示例分析
      这篇文章主要介绍sql注入之类型以及提交注入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!参数类型这里说的参数是源码中存在注入的地方。其中参数类型有:数字、字符、搜索、json等。其中sql语句干扰符号有:...
      99+
      2023-06-20
    • sql注入报错之注入原理实例解析
      目录前言0x010x020x03总结前言 我相信很多小伙伴在玩sql注入报错注入时都会有一个疑问,为什么这么写就会报错?曾经我去查询的时候,也没有找到满意的答案,时隔几个月终于找到搞清楚原理...
      99+
      2022-06-13
      sql注入 报错注入 SQL报错注入 sql注入报错
    • pymysql解决sql注入问题的示例分析
      这篇文章将为大家详细讲解有关pymysql解决sql注入问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. SQL 注入SQL 注入是非常常见的一种网络攻击...
      99+
      2022-10-18
    • Mybatis-Plus的应用场景描述及注入SQL原理分析
      目录一、背景1.1 传统Mybatis的弊端1.2 MyBatis-Plus的定位1.3 特性1.4 原理解析二、准备工作2.1 基础接口BaseMapper2.2 创建实体类对象2...
      99+
      2022-11-12
    • 常用的攻击手段SQL注入的示例分析
      这篇文章主要介绍常用的攻击手段SQL注入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、概述1. 攻击原理SQL注入是较常见的网络攻击方式之一,主要针对WEB应用,利用程序员编写代码的疏忽,对于连接数据库...
      99+
      2023-06-27
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作