千家信息网

mybatis使用${}时sql注入的问题怎么解决

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章给大家介绍mybatis使用${}时sql注入的问题怎么解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mybatis使用${}时sql注入的问题最近在上线项目的时候,
千家信息网最后更新 2025年02月01日mybatis使用${}时sql注入的问题怎么解决

这篇文章给大家介绍mybatis使用${}时sql注入的问题怎么解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

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 indexMap=new HashMap(){        {            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 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注入只有在编译时才有效,而预编译的时候是用个?代替参数,真正执行时才把参数替换?。

关于mybatis使用${}时sql注入的问题怎么解决就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

问题 参数 编译 时候 就是 用户 类型 语句 风险 内容 前端 数据 数据库 方式 更多 符号 帮助 排序 验证 不错 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华为存储服务器网页登录忘记密码 武汉软件开发定制服务 服务器的日志怎么看重启时间 国家网络安全宣传周宣传公众号 湖南安卓软件开发服务商 服务器打开ping 软件开发公司行业现状怎么写 软件开发前端的技术路线 北京软件开发人员月薪 江苏学生网络技术服务价值 mysql数据库一键安装 数据库设计索引表锁 无线网络技术教程第二版题库 阿里云香港服务器 备案吗 网络安全宣传周的主题活动 工业互联网泰笛科技有限公司 企业网络技术员职责 安徽通信软件开发服务有哪些 比亚迪软件开发查学历吗 战略支援部队网络技术 江苏教师网络安全知识竞赛 女孩学网络安全工程怎么样 社交软件开发总体设计方案 易语言写web服务器 数据库英文论文 商城应用程序需要哪些数据库表 海南特色软件开发收费 sdlc网络安全 mysql 数据库更新 数据库设计时标准数据采用
0