广告
返回顶部
首页 > 资讯 > 后端开发 > Python >关于mybatis使用${}时sql注入的问题
  • 880
分享到

关于mybatis使用${}时sql注入的问题

mybatis使用${}sql注入mybatissql注入 2022-11-12 21:11:05 880人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录mybatis使用${}时sql注入的问题区别解决方法mybatis sql注入问题之$与#在mybatis中使用$符号在mybatis中使用#符号mybatis使用${}时sq

mybatis使用${}时sql注入的问题

最近在上线项目的时候,代码审查没有通过,提示有sql注入的风险。


ORDER BY ${orderBy}

很简单的一个排序字段,但是因为使用 ${} 占位符的原因,有sql注入的风险,相信大家平时也经常会使用这个占位符,不知道有没有考虑sql注入的问题,下面简单介绍下 #{} 和 ${} 的区别以及为什么使用 ${} 会有sql注入的问题。

区别

  • #{}是一个参数占位符,对于String类型会自动加上"",其他类型不加。由于Mybatis采用预编译,其后的参数不会再进行SQL编译,所以一定程度上防止SQL注入。
  • ${}是一个简单的String替换,字符串是什么,解析就是什么。
  • 类如order by。假如前端传的参数是id(假设id是String类型),对于order by #{id},对应的sql语句就是 order by “id”;对于order by ${id},对应的sql语句则是order by id。这种情况,当用户传参为id && 1=1 的时候,就会产生难以预计的后果。

解决方法

  • 在原实体类里加入一个map

 public Map<String,String> indexMap=new HashMap<String,String>(){
        {
            put("spaceId","space_id"); // key为前端传的值,value为数据库对应的列值
            put("optTime","opt_time");
        }
    };
  • 当传参时,判断参数是否在map的key中,如果存在的话,就把对应的value作为排序的依赖条件。

if(paramOptLog.getOrderBy()!=null &&Strings.isNullOrEmpty(paramOptLog.getOrderBy())){
            OptLog optLog=new OptLog();
            paramOptLog.setOrderBy(optLog.indexMap.getOrDefault(paramOptLog.getOrderBy(), "id"));
        }
        List<OptLog> list = optLogMapper.query4Page(paramOptLog);
 }
  • 总结就是通过映射,由程序员来决定 ${} 传的参数,即将动态sql转成静态sql的方式可以解决这个问题,这样在实际调用的时候就不会有sql注入的风险了。

mybatis sql注入问题之$与#

在mybatis中使用$符号

不会进行预编译,会被sql注入

注入方式如下:

密码随便输一个就可以通过验证,只要用户名正确即可。

这样输入后查询语句在数据库中如下:


select id,username,passWord from userLogin where username='admin' OR 1=1 and password='23'

sql解释:AND优先级高于OR 首先判断后面1=1 and password='23'为false,然后判断前面username='admin'为true中间

连接为OR即最后为true OR false 最后还是为true,就直接通过验证,能够正常登陆admin用户。

在mybatis中使用#符号

这样会进行预编译,能够防止sql注入。sql注入只有在编译时才有效,而预编译的时候是用个?代替参数,真正执行时才把参数替换?。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 关于mybatis使用${}时sql注入的问题

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

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

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

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

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作