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

发布时间:2021-12-16 11:12:42 作者:柒染
来源:亿速云 阅读:846

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

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

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

ORDER BY ${orderBy}

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

区别

解决方法

 public Map<String,String> indexMap=new HashMap<String,String>(){
        {
            put("spaceId","space_id"); // key为前端传的值,value为数据库对应的列值
            put("optTime","opt_time");
        }
    };
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);
 }

mybatis sql注入问题之$与#

在mybatis中使用$符号

不会进行预编译,会被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注入的问题怎么解决

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

推荐阅读:
  1. Apache Shiro 使用手册(一)Shiro架构介绍
  2. 三分钟学会用SpringMVC搭建最小系统(超详细)

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

mybatis sql

上一篇:如何解决eclipse配置Tomcat和Tomcat出现无效端口问题

下一篇:Linux sftp命令的用法是怎样的

相关阅读

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

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