时间:2022-07-17 09:14:35 | 栏目:JAVA代码 | 点击:次
最近在上线项目的时候,代码审查没有通过,提示有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); }
不会进行预编译,会被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用户。
这样会进行预编译,能够防止sql注入。sql注入只有在编译时才有效,而预编译的时候是用个?代替参数,真正执行时才把参数替换?。